ASP.NET底層架構探索之再談.NET運行時(一)

來源:互聯網
上載者:User

本文將重點講解如何為特定的硬體裝置自訂ASP.NET Web移動程式,以及使用模板自訂Form和Panel等控制項。通過屬性重寫這個特性,使ASP.NET Web移動程式可以根據行動裝置的硬體功能,為特定的硬體指定其控制項的屬性值。例如,應用程式可能需要一個Label控制項在一些裝置上顯示較長的文本,而在另一些裝置上顯示較簡短的文本。這就需要我們為每個控制項都提供一組屬性,應用程式可以針對各個裝置重寫這些屬性。所有的ASP.NET行動控制項都具有預設的外觀和布局。對於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構建一個功能完善的行動裝置 App程式",正是因為屬性重寫功能,我們才可以使用上述的方法來構建一個針對不同行動裝置的硬體特性做出最好呈現的ASP.NET Web行動裝置 App程式。

  模板

  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:\WINDOWS\Microsoft.NET\Framework\[版本號碼]\CONFIG\Browsers目錄下,查看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>

 

<%@ 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對象顯示頁面上,代碼如下:

共2頁: 上一頁 1 [2]下一頁



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。