在一个asp.net移动页面中使用devicespecific/choice构造时,你必须定义设备筛选器来测试mobilecapabilities对象的属性。你可以在应用程序的web.config文件的<devicefilters>节点中定义设备筛选器,其中每个<filter>元素就是一个设备筛选器。下面是定义设备筛选器的语法:
<system.web>
<devicefilters>
<filter
name="filtername"
compare="capabilityname"
argument="comparisonstring"/>
<filter
name="filtername"
type="classname"
method="methodname"/>
</devicefilters>
</system.web>
如上述代码所示,存在两个<filter>元素。它分别代表两种不同类型的筛选器,分别为基于比较的筛选器和基于鉴别委托的筛选器。语法指定了这两种筛选器类型。第一种称为基于比较的筛选器,可在运行时将开发人员指定的值与设备功能的当前值进行比较。当希望确定设备是否支持某特定功能时,可使用此类筛选器。它的各个属性为:
属性 | 说明 |
name | 必需的string属性,指定设备筛选器的名称。注意,在设置该属性时要注意它是区分大小写的。例如,ishtml和ishtml代表不同的设备筛选器。 |
compare | 它包含设备筛选器计算的属性。 |
argument | 指定该功能应与之比较的参数。如果未提供任何参数,则将 null 用于比较。 |
下面来定义一个简单的基于比较的筛选器,你完全可以在一个<devicefilters>元素中定义基于比较的筛选器,而无需额外的代码。例如,我们可以添加一个用来测试某个移动设备是否支持html 3.2的设备筛选器,你仅需在web.config配置文件中添加如下的代码:
<system.web>
<devicefilters>
<filter name="ishtml32" compare="preferredrenderingtype" argument="html32">
</filter>
</devicefilters>
</system.web>
上面的代码定义了一个名为ishtml32的筛选器,它用来测试mobilecapabilities对象的preferredrenderingtype属性是否等于html32。除了在devicespecific/choice构造中使用上面的筛选器外,你还可以通过使用mobilecapabilities对象的hascapability方法来评估设备功能,此方法供asp.net内部使用,用来实现用控件语法表达的各种设备选择条件。如下面的代码所示,它也是用来查看该移动设备是否支持html3.2标记语言,如果设备具有指定的功能,则返回值为true,否则为false。注意,如果是基于比较的筛选器,hascapability方法的第二个参数为null。
mobilecapablities cap = (mobilecapabilities)request.browser;
if ((cap.hascapability ("ishtml32", null))
{
// do something.
}
提示:当你使用visual studio创建一个asp.net web移动应用程序时,在添加的移动web.config配置文件中将包含大量的基于比较的筛选器。这些筛选器包括iswml11、ishtml32、ischtml10。你可以打开该配置文件,查看所有的可用设备筛选器。 第二类设备筛选器称为基于鉴别委托的筛选器。当需要比基于比较的筛选器更为复杂的设备筛选功能时,可以通过提供方法的类名称和方法名称,指定基于鉴别委托的筛选器。在运行时,调用提供的方法来确定设备筛选器的计算结果是否为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
}
}
保存后,选择"生成"-"生成myevaluators"命令。这时会在该项目目录下的/bin/debug文件夹中生成一个名为myevaluators.dll的程序集。 而后,我们要新建一个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>
4. 最后一步就是在移动页面中添加一个devicespecific/choice构造,这样就可以根据识别出的基于鉴别委托的筛选器来自定义应用程序的呈现。例如,如果识别出设备筛选器为uselargewbmp的话,我们可以使用一个image控件显示特定的图片,万一图片无法显示,也可以在页面上用文字信息"large wbmp"作进一步的说明。 为此我们可以在页面上添加如下的代码
<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>
你可以使用不同的模拟器查来查看应用程序执行后的效果(模拟器的使用在前面的章节中已经进行了详细的介绍,这里就不重复了)