2006-09-16 文章出处:天极软件 | ||||||||||||||
|
第二类设备筛选器称为基于鉴别委托的筛选器。当需要比基于比较的筛选器更为复杂的设备筛选功能时,可以通过提供方法的类名称和方法名称,指定基于鉴别委托的筛选器。在运行时,调用提供的方法来确定设备筛选器的计算结果是否为true。该筛选器的属性为:
属性 | 说明 |
name | 筛选器的名称 |
type | 它是提供鉴别委托的类类型。名称必须符合指定完全限定类型名的Microsoft .NET标准。ASP.NET在指定的程序集中搜索该类型。 |
method | 它是类type上方法的名称,该方法根据传递给它的MobileCapabilities实例返回一个布尔值指示当前的设备是否满足此筛选器。 |
现在我们来定义一个基于鉴别委托的筛选器,首先我们需要创建一个类库项目,编写和该筛选器相关的类及方法,经过编译后,再在ASP.NET Web移动应用程序中引用包含该类的程序集,具体的实现将在后面用实例进行详细的介绍。下面是类中的静态方法的具体形式(第二个参数是可选的,你可以将该参数作为额外的输入信息添加到上面的静态方法中):
public static bool MethodName
(System.Web.Mobile.MobileCapabilities capabilities, String param)
在Web.Config配置文件中,你可以采用<filter>元素的第二种形式定义基于鉴别委托的筛选器。例如,你创建了一个名为isMMEonSony的筛选器,该筛选器使用了MyClass类中的一个名为MMEandSony的静态方法,而且该类的命名空间是MyEvaluators.dll程序集里的MyNameSpace。因此我们需要在移动Web.Config配置文件中编写如下的代码:
<system.web> <deviceFilters> <filter name="isMMEonSony" type="MyNameSpace.MyClass, MyEvaluators.dll" method="MMEandSony"> </filter> </deviceFilters> </system.web> |
在上述配置中我们设置type属性为该类的完整名称:命名空间.类名,程序集。而method属性的属性值为运行时调用的实际的方法名。
在DeviceSpecific/Choice构造中使用一个基于鉴别委托的筛选器和在DeviceSpecific/Choice构造中使用一个基于比较的筛选器没有什么太大的区别,下面是使用基于鉴别委托的筛选器的代码片断:
<mobile:Form. id="Form1" runat="server"> <mobile:Label id="Label1" runat="server" Text="Client is NOT MME on Sony"> <DeviceSpecific> <Choice Text="Client is MME on Sony" Filter="isMMEonSony"> </Choice> </DeviceSpecific> </mobile:Label> </mobile:Form> |
除了上面的方法外,你还可以在代码中使用MobileCapabilities.HasCapability方法来查看移动设备是否具备isMMEonSony基于鉴别委托的筛选器的功能,如果设备具有指定的功能,则返回值为true,否则为false。在基于鉴别委托的筛选器这种情形下,HasCapability方法的第二个参数是可选的,你可以为该参数设置一个有意义的String值。
使用第二个参数的好处就是你可以传递一些MobileCapabilities对象无法获取的移动设备信息到HasCapability方法中,例如我们知道HTTP文件头会传送一些和移动设备相关的信息,我们可以使用System.Web.HttpRequest对象的属性获取移动设备的一些由MobileCapabilities对象无法获取的其它信息。下面是具体的实现代码:
if (((MobileCapabilities)Request.Browser).HasCapability( "isMMEonSony", Request.UserLanguages[0])) { // Do something. } |
基于鉴别委托的筛选器的具体实现过程
现在我们将创建一个针对不同的移动设备显示不同类型图片的应用程序。而在本示例中,我们针对的四种不同的移动设备分别是使用HTML标记语言的大屏幕设备(例如Pocket PC)、使用HTML标记语言的小屏幕移动设备(例如i-mode)、使用WML标记语言的大屏幕移动设备(例如Ericsson R380)以及使用WML语言的小屏幕设备(例如Openwave)。为此,所创建的移动应用程序需根据请求页面的移动设备发送合适的图片文件,以便达到最好的显示效果。现在我们将所有的图片分成四种不同的格式,分别为小型的GIF图片、大型的GIF图片、小型的WBMP图片以及大型的WBMP图片。为了使程序可以区分这四种不同的图片格式,我们需要定义四个设备筛选器,具体的说明如下:
■ 使用大型的GIF图片:如果该设备支持GIF图片格式且屏幕较大,则返回true值
■ 使用小型的GIF图片:如果该设备支持GIF图片格式且屏幕较小,则返回true值
■ 使用大型的WBMP图片:如果该设备支持WBMP图片格式且屏幕较大,则返回true值
■ 使用小型的WBMP图片:如果该设备支持WBMP图片格式且屏幕较小,则返回true值
为了检测这些不同格式的文件以及移动设备的屏幕大小,我们需要在程序代码中使用MobileCapabilities对象的两个属性:PreferredImageMime和ScreenPixelsWidth。现在我们就来创建和基于鉴别委托的筛选器相关联的程序集,首先启动Visual Stduio并执行如下的步骤:
1、首先选择"文件"-"新建项目"命令,在弹出的新建项目窗口中创建一个"类库"项目,并为该项目命名为MyEvaluators,点击"确定"按钮。
2、项目创建完毕后,右键点选位于解决方案资源管理器中的"Class1.cs"文件,选择"重命名"命令,将其文件名改为"CustomEvals.cs"。
3、由于我们在方法中要使用MobileCapabilities类型的对象作参数,所有我们需要在该项目中添加一个包含MobileCapabilities类的程序集引用。在解决方案资源管理器中点击右键,在弹出的菜单中选择"添加引用"命令。在"添加引用"窗口的".NET"选项卡列表中找到"System.Web.Mobile"后双击该项,这时在解决方案资源管理器中的"引用"节点出就会新添加System.Web.Mobile子节点。
4、由于MobileCapabilities是派生自System.Web程序集中的System.Web.HttpBrowserCapabilities,为此我们以上面相同的方式在".NET"选项卡列表中添加System.Web程序集的引用。
5、在代码试图的上方添加一行代码"using System.Web.Mobile",这样我们就可以在后续的编码过程中不再需要输入MobileCapabilities类的完整名称。上面的这一切都为此后,在代码编辑窗口中输入如下的用来定义静态方法的代码:
using System; using System.Web.Mobile; namespace MSPress.MobWeb.MyEvaluators { public class CustomEvals { public static bool UseSmallGif( MobileCapabilities caps, String notused) { bool retval = false; if (caps.PreferredImageMime == "image/gif" && (caps.ScreenPixelsWidth < 100)) retval = true; return retval; } //如果该设备支持GIF图片格式且屏幕较小,返回true public static bool UseLargeGif( MobileCapabilities caps, String notused) { bool retval = false; if (caps.PreferredImageMime == "image/gif" && !(caps.ScreenPixelsWidth < 100)) retval = true; return retval; } //如果该设备支持GIF图片格式且屏幕较大,返回true public static bool UseSmallWBMP( MobileCapabilities caps, String notused) { bool retval = false; if (caps.PreferredImageMime == "image/vnd.wap.wbmp" && (caps.ScreenPixelsWidth < 100)) retval = true; return retval; } //如果该设备支持WBMP图片格式且屏幕较小,返回true public static bool UseLargeWBMP( MobileCapabilities caps, String notused) { bool retval = false; if (caps.PreferredImageMime == "image/vnd.wap.wbmp" && !(caps.ScreenPixelsWidth < 100)) retval = true; return retval; } //如果该设备支持WBMP图片格式且屏幕较大,返回true } } |
而后,我们要新建一个ASP.NET Web移动应用程序,这样就可以调用MyEvaluators.dll程序集中的各个方法,使得移动应用程序可以根据这些方法自动识别这些图片的格式以及屏幕的大小。因此我们还要执行的步骤如下:
1. 选择"文件"-"新建网站"命令,在解决方案资源管理器窗口中删除默认的Default.aspx文件,通过右键菜单的"添加新项"命令为站点添加一个"移动Web窗体"和一个"移动Web配置文件"。
2. 由于站点程序中需要使用MyEvaluators.dll程序集中的各个方法来识别所支持的图片的式以及屏幕的大小,为此我们依然要在解决方案资源管理器中通过右键菜单的"添加引用"命令来添加对MyEvaluators.dll程序集的引用,在弹出的"添加引用"对话框的"浏览"选项卡中,找到MyEvaluators.dll所在的目录,选中后点击确定即可。这样在决方案资源管理器中会新建一个"Bin"目录来存放所引用的MyEvaluators.dll程序集。
3. 打开Web.Config配置文件,输入如下的用来调用MyEvaluators.dll程序集中各方法的定义四个基于鉴别委托的筛选器的代码。
<deviceFilters> … <filter name="UseLargeGIF" type="MyEvaluators.CustomEvals,MyEvaluators" method="UseLargeGif" /> <filter name="UseSmallGIF" type="MyEvaluators.CustomEvals,MyEvaluators" method="UseSmallGif" /> <filter name="UseLargeWBMP" type="MyEvaluators.CustomEvals,MyEvaluators" method="UseLargeWBMP" /> <filter name="UseSmallWBMP" type="MyEvaluators.CustomEvals,MyEvaluators" method="UseSmallWBMP" /> </deviceFilters> |
<mobile:Form. id="Form1" runat="server"> <mobile:Image id="Image1" runat="server"> <DeviceSpecific> <Choice Filter="UseLargeWBMP" ImageUrl="LargePic.wbmp" AlternateText="Large WBMP"> </Choice> <Choice Filter="UseSmallWBMP" ImageUrl="SmallPic.wbmp" AlternateText="Small WBMP"> </Choice> <Choice Filter="UseSmallGIF" ImageUrl="SmallPic.gif" AlternateText="Small GIF"> </Choice> <Choice ImageURL="LargePic.gif" AlternateText="Large GIF"> </Choice> </DeviceSpecific> </mobile:Image> </mobile:Form> |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12641349/viewspace-150413/,如需转载,请注明出处,否则将追究法律责任。