在一個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.
}
[收藏到我的網摘] jazzking746發表於 2007年01月20日 22:31:00