ASP.NET2.0移動開發之屬性重寫和模板化
本文將重點講解如何為特定的硬件設備自定義ASP.NET Web移動程序,以及使用模板自定義Form和Panel等控件。通過屬性重寫這個特性,使ASP.NET Web移動程序可以根據移動設備的硬件功能,為特定的硬件指定其控件的屬性值。例如,應用程序可能需要一個Label控件在一些設備上顯示較長的文本,而在另一些設備上顯示較簡短的文本。這就需要我們為每個控件都提供一組屬性,應用程序可以針對各個設備重寫這些屬性。所有的ASP.NET移動控件都具有默認的外觀和布局。對于ASP.NET移動控件,你可通過設置屬性或使用樣式來改變移動控件的默認外觀。你還可以使用模板自定義某些移動控件的外觀。本章還將重點介紹模板和模板集,以及它們的使用方法。
自定義的方式
在前面的幾個專題中,我們提過如何使用設備篩選器為特定設備進行自定義。除此之外,我們還可以使用模板化技術和屬性重寫功能使你可以自定義你的應用程序,以便對特定的設備類型以不同的方式呈現控件。如果你在.aspx頁面中為一個控件使用上述的任何一種自定義方法,都可以使用一個名為DeviceSpecific/Choice構造的移動控件語法。DeviceSpecific/Choice構造通常是為特定于設備的選項模板集以及控件內在多個備選內容之間指定一個選項。例如,下面的代碼是一個Label控件的聲明語法,在這個聲明中包含了一個用來鑒別當前瀏覽器是否支持HTML的DeviceSpecific/Choice構造。
其中Filter屬性指定了一個設備篩選器,該設備篩選器其名稱為isHTML32,它用來鑒別一個移動設備是否內置了HTML瀏覽器。如果內置了HTML瀏覽器的話,將會在Label控件上應用"Text for selected device"這段文本。相反的,就不作任何的顯示。正如上述的代碼所示,在<DeviceSpecific></DeviceSpecific>內通常包含一個或多個<Choice>元素,每個元素都包含指定如何根據目標設備功能計算選項的屬性。運行時依次計算每個選項,并使用成功計算出的第一個選項(這和C#里的switch case語句非常相似)。
在開始學習如何定義一個設備篩選器前,先讓我們先了解一些基本的概念,例如屬性重寫和模板化的具體含義。
屬性重寫
一般情況下,我們開發的ASP.NET Web移動程序并不是針對某個具體的設備,而是可以根據移動設備硬件特性的不同,通過適應性的調整從而可以在幾乎所有的硬件設備上進行良好的呈現。
但是因為品牌和型號的不同,這些移動設備間就不可避免地存在一些差異。例如支持的顏色、屏幕大小、輸入功能以及瀏覽器使用的標記語言等。前面提到過,ASP.NET控件是可以被幾乎所有的硬件設備支持的,因為它們本身就具有適應性調整的功能,而且控件設置的屬性值也會伴隨ASP.NET控件應用到具體的應用程序中,并不會因為硬件設備的不同使屬性值不同。但是,在某些情況下你可能舍棄默認的呈現,采用自定義的呈現方式。一個典型的例子就是字符的顯示,例如我們使用Label控件進行字符串的顯示,在一些屏幕較小的設備上,每一行顯示的字符數也是較少的,因此我們可以為該控件的Text屬性設置為"我們使用ASP.NET",而針對一些大屏幕的設備,我們可以將Label控件的Text屬性設置為"我們使用ASP.NET構建一個功能完善的移動應用程序",正是因為屬性重寫功能,我們才可以使用上述的方法來構建一個針對不同移動設備的硬件特性做出最好呈現的ASP.NET Web移動應用程序。
模板
Form、Panel、List和ObjectList等移動控件都是模板化的控件。開發人員通常使用模板來改變或豐富應用程序的外觀或內容。例如,如果為Form控件指定并選擇了頁眉或頁腳模板,則該模板中包含的標記將被添加到窗體內容中,分別作為頁眉或頁腳進行呈現。請注意模板不同于樣式,模板定義要顯示的內容和控件。當應用程序呈現模板附加到的控件時,即會呈現模板。而樣式指定內容和控件的外觀,您的應用程序可在不使用模板的情況下使用樣式,它也可在模板內將樣式應用于您定義的移動控件。 除了模板外,ASP.NET移動控件在此基礎上還擴展了一個新的模型,并引入了模板集的概念。模板集是由模板組成的集合。但是,單個模板化控件可能引用多個模板集,而每個模板集都具有不同的特定于設備的條件。模板集的具體實現將在后續章節具體介紹。
設備篩選器詳解
使用設備篩選器,應用程序可為特定硬件設備或設備類別自定義控件的外觀。該自定義基于用來瀏覽應用程序的硬件設備的功能。 例如,假設開發人員正在開發主要用于支持位圖 (.bmp) 圖像的特定品牌手持式設備的應用程序。在此設備上,開發人員決定同時用來自.bmp文件的文本和圖標顯示List控件中的所有項。通過使用設備篩選器,應用程序可檢測到它是否正在目標手持式設備上被用戶瀏覽。這會導致應用程序使用同時用文本和圖標顯示列表項的設備特定的模板。此技術可為特定硬件設備自定義應用程序。進一步擴充此示例,假設您還希望可在顯示.gif圖像的任意類型設備上瀏覽該應用程序。您的應用程序可應用檢測程序何時在此類設備上使用的設備篩選器。在該情況下,該程序指定使用文本和列表項圖標的 .gif 圖像(而不是.bmp圖像)顯示列表項的模板。這就為一類設備自定義了應用程序。
設備篩選器可完成的一些其他任務包括:
■ 根據設備類型選擇樣式。
■ 在支持使用更為豐富的表現形式呈現控件的設備上,我們可以盡量利用該硬件設備的 性能,使用一些更加細致的、具體的呈現方式。
■ 在顯示功能受限制的設備上,使用更為簡單的表現形式呈現控件。
在DeviceSpecific/Choice構造中的<Choice>元素依賴于移動設備的功能。當你使用某移動設備請求一個ASP.NET移動頁面時,首先就會將包含該移動設備型號和內置瀏覽器等信息通過HTTP文件頭傳送到服務器端,這時服務器就會根據HTTP文件頭傳送的這些信息構建一個System.Web.Mobile.MobileCapabilities對象,以此來響應客戶端請求。而設備篩選器就是利用MobileCapabilities對象的一些只讀屬性進行工作的。一個典型的例子就是設備篩選器如何鑒別那些支持HTML 3.2標記語言的瀏覽器,實現這種鑒別就是檢測和客戶請求相關的MobileCapabilities對象的PreferredRenderingType屬性值是否為"html32",是的話就是支持HTML 3.2標記語言的瀏覽器。
注意,MobileCapabilities對象的各個屬性是和瀏覽頁面的移動設備戚戚相關的。例如,當使用Pocket Internet Explorer瀏覽器請求頁面時,MobileCapabilities對象的Browser屬性將被設置為"Pocket IE", PreferredRenderingType屬性值設置為"html32",而ScreenPixelsWidth 和ScreenPixelsHeight屬性取決于移動設備的具體型號,因為Pocket PC、Smartphone和Windows CE .NET都可以使用Pocket Internet Explorer瀏覽器,但是這些設備屏幕的分辨率是不同的。
因為不同移動設備使用的瀏覽器是不同的,因此相應的MobileCapabilities對象各個屬性也存在差異。如果你要查看特定瀏覽器的MobileCapabilities對象,你可以在C:WINDOWSMicrosoft.NETFramework[版本號]CONFIGBrowsers目錄下,查看openwave、Pocket Internet Explorer、palm和nokia等眾多瀏覽器的信息。下面是openwave瀏覽器對應文件的一段代碼片斷,在使用該瀏覽器請求頁面時,這些信息就會通過HTTP文件頭傳送到服務器端,并構建具有類似屬性值的MobileCapabilities對象。
當然,你還可以通過代碼的方式將請求頁面的瀏覽器信息通過MobileCapabilities對象顯示頁面上,代碼如下:
提示:在某些情況下,某特定移動設備的MobileCapabilities對象獲得的屬性值并不是你期望的值。例如,我們經常在開發過程中直接使用桌面的IE來測試程序,你也許會認為PreferredRenderingType屬性值為"html40",而實際上這個值為"html32",這是因為ASP.NET移動控件只支持HTML 3.2,所以發送到桌面IE的標記語言依然是HTML 3.2。
MobileCapabilities的屬性
MobileCapabilities類包含了大量的屬性,我們可以使用這些屬性來獲取移動設備及其瀏覽器 的相關信息。關于該類的具體細節你可以查看MSDN,在這里我們只列舉出一些常用的屬性:
我們可以使用HttpRequest對象的Browser屬性指向MobileCapabilities對象的實例,然后可以使用此實例來讀取請求瀏覽器和設備的功能。下面是測試MobileCapabilities對象的某個屬性的代碼片斷:
在下一節中,將介紹如何在ASP.NET移動站點程序中定義一個設備篩選器,以及設備篩選器的兩種不同類型的具體實現。
自定義的方式
在前面的幾個專題中,我們提過如何使用設備篩選器為特定設備進行自定義。除此之外,我們還可以使用模板化技術和屬性重寫功能使你可以自定義你的應用程序,以便對特定的設備類型以不同的方式呈現控件。如果你在.aspx頁面中為一個控件使用上述的任何一種自定義方法,都可以使用一個名為DeviceSpecific/Choice構造的移動控件語法。DeviceSpecific/Choice構造通常是為特定于設備的選項模板集以及控件內在多個備選內容之間指定一個選項。例如,下面的代碼是一個Label控件的聲明語法,在這個聲明中包含了一個用來鑒別當前瀏覽器是否支持HTML的DeviceSpecific/Choice構造。
| <mobile:Label id="Label1" runat="server" Text="Default text"> <DeviceSpecific> <Choice Filter="isHTML32" Text="Text for selected devices" ></Choice> </DeviceSpecific> </mobile:Label> |
其中Filter屬性指定了一個設備篩選器,該設備篩選器其名稱為isHTML32,它用來鑒別一個移動設備是否內置了HTML瀏覽器。如果內置了HTML瀏覽器的話,將會在Label控件上應用"Text for selected device"這段文本。相反的,就不作任何的顯示。正如上述的代碼所示,在<DeviceSpecific></DeviceSpecific>內通常包含一個或多個<Choice>元素,每個元素都包含指定如何根據目標設備功能計算選項的屬性。運行時依次計算每個選項,并使用成功計算出的第一個選項(這和C#里的switch case語句非常相似)。
在開始學習如何定義一個設備篩選器前,先讓我們先了解一些基本的概念,例如屬性重寫和模板化的具體含義。
屬性重寫
一般情況下,我們開發的ASP.NET Web移動程序并不是針對某個具體的設備,而是可以根據移動設備硬件特性的不同,通過適應性的調整從而可以在幾乎所有的硬件設備上進行良好的呈現。
但是因為品牌和型號的不同,這些移動設備間就不可避免地存在一些差異。例如支持的顏色、屏幕大小、輸入功能以及瀏覽器使用的標記語言等。前面提到過,ASP.NET控件是可以被幾乎所有的硬件設備支持的,因為它們本身就具有適應性調整的功能,而且控件設置的屬性值也會伴隨ASP.NET控件應用到具體的應用程序中,并不會因為硬件設備的不同使屬性值不同。但是,在某些情況下你可能舍棄默認的呈現,采用自定義的呈現方式。一個典型的例子就是字符的顯示,例如我們使用Label控件進行字符串的顯示,在一些屏幕較小的設備上,每一行顯示的字符數也是較少的,因此我們可以為該控件的Text屬性設置為"我們使用ASP.NET",而針對一些大屏幕的設備,我們可以將Label控件的Text屬性設置為"我們使用ASP.NET構建一個功能完善的移動應用程序",正是因為屬性重寫功能,我們才可以使用上述的方法來構建一個針對不同移動設備的硬件特性做出最好呈現的ASP.NET Web移動應用程序。
模板
Form、Panel、List和ObjectList等移動控件都是模板化的控件。開發人員通常使用模板來改變或豐富應用程序的外觀或內容。例如,如果為Form控件指定并選擇了頁眉或頁腳模板,則該模板中包含的標記將被添加到窗體內容中,分別作為頁眉或頁腳進行呈現。請注意模板不同于樣式,模板定義要顯示的內容和控件。當應用程序呈現模板附加到的控件時,即會呈現模板。而樣式指定內容和控件的外觀,您的應用程序可在不使用模板的情況下使用樣式,它也可在模板內將樣式應用于您定義的移動控件。 除了模板外,ASP.NET移動控件在此基礎上還擴展了一個新的模型,并引入了模板集的概念。模板集是由模板組成的集合。但是,單個模板化控件可能引用多個模板集,而每個模板集都具有不同的特定于設備的條件。模板集的具體實現將在后續章節具體介紹。
設備篩選器詳解
使用設備篩選器,應用程序可為特定硬件設備或設備類別自定義控件的外觀。該自定義基于用來瀏覽應用程序的硬件設備的功能。 例如,假設開發人員正在開發主要用于支持位圖 (.bmp) 圖像的特定品牌手持式設備的應用程序。在此設備上,開發人員決定同時用來自.bmp文件的文本和圖標顯示List控件中的所有項。通過使用設備篩選器,應用程序可檢測到它是否正在目標手持式設備上被用戶瀏覽。這會導致應用程序使用同時用文本和圖標顯示列表項的設備特定的模板。此技術可為特定硬件設備自定義應用程序。進一步擴充此示例,假設您還希望可在顯示.gif圖像的任意類型設備上瀏覽該應用程序。您的應用程序可應用檢測程序何時在此類設備上使用的設備篩選器。在該情況下,該程序指定使用文本和列表項圖標的 .gif 圖像(而不是.bmp圖像)顯示列表項的模板。這就為一類設備自定義了應用程序。
設備篩選器可完成的一些其他任務包括:
■ 根據設備類型選擇樣式。
■ 在支持使用更為豐富的表現形式呈現控件的設備上,我們可以盡量利用該硬件設備的 性能,使用一些更加細致的、具體的呈現方式。
■ 在顯示功能受限制的設備上,使用更為簡單的表現形式呈現控件。
在DeviceSpecific/Choice構造中的<Choice>元素依賴于移動設備的功能。當你使用某移動設備請求一個ASP.NET移動頁面時,首先就會將包含該移動設備型號和內置瀏覽器等信息通過HTTP文件頭傳送到服務器端,這時服務器就會根據HTTP文件頭傳送的這些信息構建一個System.Web.Mobile.MobileCapabilities對象,以此來響應客戶端請求。而設備篩選器就是利用MobileCapabilities對象的一些只讀屬性進行工作的。一個典型的例子就是設備篩選器如何鑒別那些支持HTML 3.2標記語言的瀏覽器,實現這種鑒別就是檢測和客戶請求相關的MobileCapabilities對象的PreferredRenderingType屬性值是否為"html32",是的話就是支持HTML 3.2標記語言的瀏覽器。
注意,MobileCapabilities對象的各個屬性是和瀏覽頁面的移動設備戚戚相關的。例如,當使用Pocket Internet Explorer瀏覽器請求頁面時,MobileCapabilities對象的Browser屬性將被設置為"Pocket IE", PreferredRenderingType屬性值設置為"html32",而ScreenPixelsWidth 和ScreenPixelsHeight屬性取決于移動設備的具體型號,因為Pocket PC、Smartphone和Windows CE .NET都可以使用Pocket Internet Explorer瀏覽器,但是這些設備屏幕的分辨率是不同的。
因為不同移動設備使用的瀏覽器是不同的,因此相應的MobileCapabilities對象各個屬性也存在差異。如果你要查看特定瀏覽器的MobileCapabilities對象,你可以在C:WINDOWSMicrosoft.NETFramework[版本號]CONFIGBrowsers目錄下,查看openwave、Pocket Internet Explorer、palm和nokia等眾多瀏覽器的信息。下面是openwave瀏覽器對應文件的一段代碼片斷,在使用該瀏覽器請求頁面時,這些信息就會通過HTTP文件頭傳送到服務器端,并構建具有類似屬性值的MobileCapabilities對象。
| <capabilities> <capability name="browser" value="Phone.com" /> <capability name="canInitiateVoiceCall" value="true" /> <capability name="canSendMail" value="false" /> <capability name="deviceID" value="${deviceID}" /> <capability name="deviceVersion" value="${deviceVersion}" /> <capability name="inputType" value="telephoneKeypad" /> <capability name="isMobileDevice" value="true" /> <capability name="majorVersion" value="${browserMajorVersion}" /> <capability name="maximumRenderedPageSize" value="1492" /> <capability name="minorVersion" value="${browserMinorVersion}" /> <capability name="numberOfSoftkeys" value="2" /> <capability name="optimumPageWeight" value="700" /> <capability name="preferredImageMime" value="image/vnd.wap.wbmp" /> <capability name="preferredRenderingMime" value="text/vnd.wap.wml" /> <capability name="preferredRenderingType" value="wml11" /> <capability name="requiresAdaptiveErrorReporting" value="true" /> <capability name="rendersBreakBeforeWmlSelectAndInput" value="true" /> <capability name="rendersWmlDoAcceptsInline" value="false" /> <capability name="rendersWmlSelectsAsMenuCards" value="true" /> <capability name="requiresFullyQualifiedRedirectUrl" value="true" /> <capability name="requiresNoescapedPostUrl" value="true" /> <capability name="requiresPostRedirectionHandling" value="true" /> <capability name="supportsRedirectWithCookie" value="false" /> <capability name="type" value="Phone.com${browserMajorVersion}" /> <capability name="version" value="${browserMajorVersion}${browserMinorVersion}" /> </capabilities> |
當然,你還可以通過代碼的方式將請求頁面的瀏覽器信息通過MobileCapabilities對象顯示頁面上,代碼如下:
| <%@ Page Inherits="System.Web.UI.MobileControls.MobilePage" Language="c#" %> <script language="c#" runat="server"> public void Page_Load(Object sender, EventArgs e) { System.Web.Mobile.MobileCapabilities currentCapabilities; MobileCapabilities currentCapabilities = (MobileCapabilities)Request.Browser; // 創建一個MobileCapabilities對象來獲取瀏覽器的信息 if(currentCapabilities.PreferredRenderingMIME=="text/html") { Label2.Text = "你使用的是支持HTML的移動設備"; //如果是支持HTML的移動設備的話,顯示上面的文本信息 } else if(currentCapabilities.PreferredRenderingMIME == "text/vnd.wap.wml") { Label2.Text = "你使用的是支持WML的移動設備"; //如果是支持WML的移動設備的話,顯示上面的文本信息 } Label1.Text = "屏幕的寬度(字符數): " + currentCapabilities.ScreenCharactersWidth; //顯示當前移動設備每一行可以顯示的字符數 } </script> <Mobile:Form runat="server" id=frmTemplate > <mobile:label ID="Label1" runat="server" /> <mobile:label ID="Label2" runat="server" /> </Mobile:Form> |
提示:在某些情況下,某特定移動設備的MobileCapabilities對象獲得的屬性值并不是你期望的值。例如,我們經常在開發過程中直接使用桌面的IE來測試程序,你也許會認為PreferredRenderingType屬性值為"html40",而實際上這個值為"html32",這是因為ASP.NET移動控件只支持HTML 3.2,所以發送到桌面IE的標記語言依然是HTML 3.2。
MobileCapabilities的屬性
MobileCapabilities類包含了大量的屬性,我們可以使用這些屬性來獲取移動設備及其瀏覽器 的相關信息。關于該類的具體細節你可以查看MSDN,在這里我們只列舉出一些常用的屬性:
| 屬性 | 說明 |
| Browser | 瀏覽器的類型。例如Pocket IE、Microsoft Mobile Explorer、 i-mode、Nokia、Openwave和Ericsson等。 |
| CanInitiateVoiceCall | 當該設備的瀏覽器可以啟動語音呼叫時返回true值 |
| CanSendMail | 如果該設備的瀏覽器支持郵件的發送,就返回true值 |
| HasBackButton | 如果該瀏覽器有一個專用的"上一步"按鈕的話,則返回true值 |
| InputType | 返回瀏覽器支持的輸入類型,包括virtualKeyboard、telephoneKeypad和keyboard等值 |
| IsColor | 該設備是否支持顏色顯示,是的話返回true值。 |
| MaximumSoftkeyLabelLength | 返回軟鍵標簽可顯示的文本的最大字符數 |
| MobileDeviceManufacturer | 返回移動設備制造商的名稱,如果為未知的話返回的是unknown |
| MobileDeviceModel | 獲取移動設備的型號名(如果已知) |
| NumberOfSoftkeys | 返回移動設備上軟鍵的數目。 |
| PreferredImageMime | 返回瀏覽器通常首選的圖像內容類型的MIME類型。這些值包括image/gif、image/jpeg、image/vnd.wap.wbmp和image/bmp |
| PreferredRenderingMime | 返回瀏覽器通常首選的內容類型的MIME類型。這些值包括text/html和text/vnd.wap.wml |
| PreferredRenderingType | 返回一個指出該瀏覽器使用的標記語言及版本信息的字符串,這些字符串通常為html32、wml11、wml12或者chtml10 |
| ScreenBitDepth | 返回屏幕的顯示深度(以每像素位數為單位) |
| ScreenCharactersHeight | 返回顯示的近似高度(以字符行為單位) |
| ScreenCharactersWidth | 返回顯示的近似寬度(以字符為單位) |
| ScreenPixelsHeight | 返回顯示的近似高度(以像素為單位) |
| ScreenPixelsWidth | 返回顯示的近似寬度(以像素為單位) |
| SupportsIModeSymbols | 獲取一個值,該值指示瀏覽器是否支持i-mode符號。 |
| SupportsJPhoneSymbols | 獲取一個值,該值指示瀏覽器是否支持J-Phone特定的圖片符號。 |
我們可以使用HttpRequest對象的Browser屬性指向MobileCapabilities對象的實例,然后可以使用此實例來讀取請求瀏覽器和設備的功能。下面是測試MobileCapabilities對象的某個屬性的代碼片斷:
| MobileCapabilities capabilities = (MobileCapabilities)Request.Browser; if (capabilities.ScreenPixelsWidth > 120) { // 為大屏幕的移動設備添加的代碼 } else { //為小屏幕的移動設備添加的代碼 } |
在下一節中,將介紹如何在ASP.NET移動站點程序中定義一個設備篩選器,以及設備篩選器的兩種不同類型的具體實現。