本主題是ASP.NET在移動設備上展示的方面的內容 起初看起來deviceFilters與前面的browserCaps類似。同樣也會關聯到HttpBrowserCapabilities,而在這裡用到的是MobileCapabilities,但是細看後發現browserCaps關註的是瀏覽器,devi ...
本主題是ASP.NET在移動設備上展示的方面的內容
起初看起來deviceFilters與前面的browserCaps類似。同樣也會關聯到HttpBrowserCapabilities,而在這裡用到的是MobileCapabilities,但是細看後發現browserCaps關註的是瀏覽器,deviceFilters關註的是設備本身。
定義了設備篩選器之後,您可以將其應用於 ASP.NET 移動控制項中以定義特定於設備的呈現。 應用的設備篩選器映射到 .aspx 文件中 DeviceSpecific構造內的 <choice> 元素。 然後,您可以為這些應用的設備篩選器設置屬性重寫和模板化。 一些特定於設備的自定義示例包括:
- 重寫控制項的屬性,例如根據顯示功能為 Image 控制項選擇不同的圖像。
- 對不同的移動設備使用不同的呈現樣式。
-
在設備(例如 Pocket PC)上使用模板實現更豐富的呈現。
這些方案中的每一個都需要根據目標設備是否與 Web.config 文件中的 <deviceFilters> 節匹配來進行篩選。 這些篩選器也可能遍佈在應用程式中,而不是只出現在一個地方。
實際上服務端從一個HTTP請求得知這些信息,請求頭肯定有附帶。在面前的內容知道,瀏覽器的信息通過對User-Agent的識別,再通過瀏覽器功能定義,把結果存放在HttpBrowserCapabilities中,而這裡對設備功能判定的就是基於這裡得出的HttpBrowserCapabilities來進行。
ASP.NET內置的設備功能可查看附表1
可以從兩種設備篩選器中進行選擇:比較計算器或計算委托。
對於簡單的比較,可以通過提供功能的名稱和要與之比較的值,指定基於比較的篩選器。 在運行時,如果功能值和提供的值相等,則設備篩選器的計算結果為 true。 布爾值屬性在比較時不區分大小寫;因此,true 和 True 都有效。 其他屬性比較區分大小寫。
對於更複雜的計算,您可以通過提供方法的類和方法名指定基於計算委托的篩選器。 在運行時,調用所提供的方法來確定設備篩選器的計算結果是否為 true。
在Web.config文件中配置如下
<deviceFilters> <filter name="IsHtml" compare="PreferredRendering" argument="html32" /> <filter name="GPSEnabled" type="MyApplication.MyCapabilityEvaluators,MyApplication" method="IsGPSEnabled" /> </deviceFilters>
對於第一個filter是用比較計算器的,compare特性是指定由比較計算器計算的瀏覽器功能。 該功能可以是任何內置功能,也可以是任何其他自定義功能計算器的名稱。argument特性是指定該功能應與之比較的參數;
對於第二個filter是用計算委托,type是指定提供計算委托的類類型。是類的完全限定名:(類的全名+","+程式集名稱),method特性是指定提供計算委托的方法。
下麵的示例演示如何定義名為 isHTML32 的設備篩選器。
<filter name="isHTML32" compare="PreferredRenderingType" argument="html32" />
在運行時,此篩選器將當前請求的 MobileCapabilities 實例的 PreferredRenderingType 屬性值與值 html32 進行比較。
下麵的示例演示如何定義名為 GPSEnabled 的新功能。
namespace MyAssembly { publicclass MyCapabilityEvaluators { publicstaticbool IsGPSEnabled( System.Web.Mobile.MobileCapabilities capabilities, String unusedArg) { // processing code } } }
將以下元素添加到適當的 Web.config 文件以添加新功能:
<filter name="GPSEnabled" type="MyNamespace.MyCapabilityEvaluators, MyAssembly" method="IsGPSEnabled" />
如果使用 Filter 屬性指定方法名稱,則該方法必須符合以下原型
public bool methodName( System.Web.Mobile.MobileCapabilities capabilities, String optionalArgument);
若需要獲取設備是否支持指定功能可以使用以下方式
對於內置的功能除了可以用MobileCapabilities的屬性進行比較外,還可以這樣子
((System.Web.Mobile.MobileCapabilities)System.Web.HttpContext.Current.Request.Browser).HasCapability("ScreenBitDepth", "8");
返回的是一個bool值,表明是否具備該功能;
對於自定義的功能,只能通過HasCapability
((System.Web.Mobile.MobileCapabilities)System.Web.HttpContext.Current.Request.Browser).HasCapability("GPSEnabled", null);
HasCapability 方法使用兩個參數:capabilityName,它是功能字典中設備計算方法、屬性或項的名稱;optionalArgument,它是 capabilityName參數需要的任何參數。 HasCapability 方法按照以下順序執行其計算:
- 它檢查 capabilityName 值是否是 Web.config 文件中指定的設備篩選器的名稱。
註意 |
HasCapability 方法通過將 optionalArgument 參數設置為 null 來計算 <DeviceSpecific> 和 <Choice> 構造。 |
- 如果第 1 步中的測試返回 true 並且篩選器是委托計算器(使用自定義方法計算指定數據的篩選器),則 HasCapability 方法將使用optionalArgument 參數中提供的參數調用委托並返回結果。
- 如果第 1 步中的測試返回 true 並且篩選器是比較計算器(將功能名與某個指定的值進行比較的篩選器),則 HasCapability 方法將使用該功能名和計算器中提供的參數(忽略所有原始 optionalArgument 參數)調用其本身並返回結果。
- 如果 MobileCapabilities 對象具有名為 capabilityName 的屬性,則 HasCapability 方法將此屬性強制轉換為字元串併在optionalArgument 值等於該字元串時返回 true。 布爾型比較不區分大小寫;其他比較區分大小寫。 因此,"true"等同於"True",但"left"不等於"Left"。
- 如果不存在任何 capabilityName 屬性,則 HasCapability 方法將在與 MobileCapabilities 對象關聯的功能字典中進行查找。 如果capabilityName 屬性存在,則 HasCapability 方法將其與 optionalArgument 參數進行比較並返回結果。 因為字典可以維護字元串,所以無需進行強制轉換。
- 如果這些測試失敗,HasCapability 方法將引發 ArgumentOutOfRangeException 異常。
附表1
下表從適配器開發人員的角度列出了 ASP.NET 移動控制項設備屬性及有效的標記語言。 此表還列出對於應用程式邏輯中的常規使用有效、從而適用於所有標記語言的屬性(通常不是呈現標記的屬性)。