ASP.NET 2.0移動開發之定義設備篩選器
在一個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> |
你可以使用不同的模擬器查來查看應用程序執行後的效果(模擬器的使用在前面的章節中已經進行了詳細的介紹,這裏就不重複了)