asp.net
在一個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行動裝置 App程式時,在添加的移動Web.Config設定檔中將包含大量的基於比較的篩選器。這些篩選器包括isWML11、isHTML32、isCHTML10。你可以開啟該設定檔,查看所有的可用裝置篩選條件。
第二類裝置篩選條件稱為基於鑒別委託的篩選器。當需要比基於比較的篩選器更為複雜的裝置篩選功能時,可以通過提供方法的類名稱和方法名稱,指定基於鑒別委託的篩選器。在運行時,調用提供的方法來確定裝置篩選條件的計算結果是否為true。該篩選器的屬性為:
| 屬性 |
說明 |
| name |
篩選器的名稱 |
| type |
它是提供鑒別委託的類類型。名稱必須符合指定完全限定類型名的Microsoft .NET標準。ASP.NET在指定的程式集中搜尋該類型。 |
| method |
它是類type上方法的名稱,該方法根據傳遞給它的MobileCapabilities執行個體返回一個布爾值指示當前的裝置是否滿足此篩選器。 |
現在我們來定義一個基於鑒別委託的篩選器,首先我們需要建立一個類庫項目,編寫和該篩選器相關的類及方法,經過編譯後,再在ASP.NET Web行動裝置 App程式中引用包含該類的程式集,具體的實現將在後面用執行個體進行詳細的介紹。下面是類中的靜態方法的具體形式(第二個參數是可選的,你可以將該參數作為額外的輸入資訊添加到上面的靜態方法中):
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)。為此,所建立的行動裝置 App程式需根據請求頁面的行動裝置發送合適的圖片檔案,以便達到最好的顯示效果。現在我們將所有的圖片分成四種不同的格式,分別為小型的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行動裝置 App程式,這樣就可以調用MyEvaluators.dll程式集中的各個方法,使得行動裝置 App程式可以根據這些方法自動識別這些圖片的格式以及螢幕的大小。因此我們還要執行的步驟如下:
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>
你可以使用不同的模擬器查來查看應用程式執行後的效果(模擬器的使用在前面的章節中已經進行了詳細的介紹,這裡就不重複了)