top
Loading...
ASP.NET2.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>

你可以使用不同的模擬器查來查看應用程序執行后的效果(模擬器的使用在前面的章節中已經進行了詳細的介紹,這里就不重復了)
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗