共用方式為


伺服器控制項

Microsoft提供

ASP.NET 2.0 以多種方式增強伺服器控制項。 在本課程模組中,我們將討論 ASP.NET 2.0 和 Visual Studio 2005 處理伺服器控制項方式的一些架構變更。

ASP.NET 2.0 以多種方式增強伺服器控制項。 在本課程模組中,我們將討論 ASP.NET 2.0 和 Visual Studio 2005 處理伺服器控制項方式的一些架構變更。

檢視狀態

ASP.NET 2.0 中檢視狀態的主要變更會大幅減少大小。 請考慮只包含行事曆控制項的頁面。 以下是 ASP.NET 1.1 中的檢視狀態。

dDwtMTg1NDkwMjc0Nzt0PDtsPGk8MT47PjtsPHQ8O2w8aTwxPjs
+O2w8dDxAMDxwPHA8bDxTRDs+O2w8bDxTeXN0ZW0uRGF0ZVRpbWUsIG1
zY29ybGliLCBWZXJzaW9uPTEuMC41MDAwLjAsIEN1bHR1cmU9bmV1dHJ
hbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OTwyMDA1LTE
xLTA4Pjs+Oz4+Oz47Ozs7Ozs7Ozs7Pjs7Pjs+Pjs+Pjs+lkX2YWqfACtP
/VWr8G03pob/+tU=

現在,以下是 ASP.NET 2.0 中相同頁面上的檢視狀態。

/wEPDwULLTEzNjg5MjAxMzgPZBYCAgMPZBYCAgEPPCsAC
gEADxYCHgJTRBYBBgDAEX8OsscIZGRkllfArINjlhvzQX7Xfign2q6HK5E=

這是相當重要的變更,而且考慮到檢視狀態是透過網路來回傳輸,這項變更可讓開發人員大幅提升效能。 檢視狀態的大小縮減主要是因為我們在內部處理它的方式。 請記住,檢視狀態是 Base64 編碼字串。 若要進一步瞭解 ASP.NET 2.0 中檢視狀態的變更,讓我們看看上述範例中的解碼值。

以下是已解碼的 1.1 檢視狀態:

t<-1854902747;t<;l<i<1>;>;l<t<;l<
i<1>;>;l<t<@0<p<p<l<SD;>;l<l<
System.DateTime, mscorlib, Version=1.0.5000.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089<2005-11-08>;>;>>;
>;;;;;;;;;;>;;>;>>;>>;>Eaj

這看起來可能有點像 gibberish,但這裡有一個模式。 在 ASP.NET 1.x 中,我們使用單一字元來識別資料類型,並使用 <> 字元來分隔值。 上述檢視狀態範例中的 「t」 代表 Triplet。 Triplet 包含一對 ArrayLists (「l」 代表 ArrayList.) 其中一個 ArrayLists 包含值為 1 的 Int32 (「i」) ,另一個則包含另一個 Triplet。 Triplet 包含一對 ArrayList 等。請務必記住,我們使用包含配對的 Triplets、透過字母識別資料類型,並使用 < 和 > 字元做為分隔符號。

在 ASP.NET 2.0 中,解碼的檢視狀態看起來有點不同。

-1368920138 d 
 d 
 
 
 SD 
 dddWc A ('ڮ

您應該注意到已解碼檢視狀態的外觀有很大的變更。 這項變更有數個架構基礎。 ASP.NET 1.x 中的檢視狀態使用 LosFormatter 序列化資料。 在 2.0 中,我們使用新的 ObjectStateFormatter 類別。 這個類別特別設計來協助序列化和還原序列化檢視狀態和控制狀態。 下一節將涵蓋 (控制項狀態。) 變更序列化和還原序列化的方法,可獲得許多好處。 其中一個最顯著的事實是,不同于使用 TextWriter 的 LosFormatter,ObjectStateFormatter 使用 BinaryWriter。 這可讓 ASP.NET 2.0 儲存一系列位元組的檢視狀態,而不是字串。 例如,採用整數。 在 ASP.NET 1.1 中,整數需要 4 個位元組的檢視狀態。 在 ASP.NET 2.0 中,相同的整數只需要 1 位元組。 已進行其他增強功能,以減少儲存的檢視狀態數量。 例如,DateTime 值現在會使用 TickCount 而非字串來儲存。

就像所有都不夠,特別注意的是 1.x 中檢視狀態的其中一個最大取用者是 DataGrid 和類似的控制項。 DataGrid 這類控制項的主要缺點是檢視狀態通常包含大量的重複資訊。 在 ASP.NET 1.x 中,重複的資訊只會儲存在一次之後,導致檢視狀態過重。 在 ASP.NET 2.0 中,我們使用新的 IndexedString 類別來儲存這類資料。 如果字串重複,我們只會將 IndexedString 的權杖和索引儲存在 IndexedString 物件的執行中資料表內。

控制狀態

開發人員具有檢視狀態的主要底線之一是新增至 HTTP 承載的大小。 如先前所述,檢視狀態的最大取用者之一是 DataGrid 控制項。 為了避免 DataGrid 所產生的大量檢視狀態,許多開發人員只要停用該控制項的檢視狀態即可。 不幸的是,該解決方案不一定是不錯的解決方案。 ASP.NET 1.x 中的檢視狀態不僅包含控制項正確功能所需的資料。 它也包含控制項 UI 狀態的相關資訊。 這表示如果您想要允許在 DataGrid 上進行分頁,即使您不需要檢視狀態包含的所有 UI 資訊,您也必須啟用檢視狀態。 這是全無案例。

在 ASP.NET 2.0 中,控制項狀態可透過引進控制項狀態,妥善解決該問題。 控制項狀態包含控制項適當功能絕對必要的資料。 不同于檢視狀態,無法停用控制項狀態。 因此,請務必謹慎控制儲存在控制狀態中的資料。

注意

控制項狀態會與__VIEWSTATE隱藏表單欄位中的檢視狀態一起保存。

這段影片是檢視狀態和控制項狀態的逐步解說。

說明檢視狀態和控制項狀態欄位的逐步解說影片螢幕擷取畫面,其中顯示 Windows 檔案總管瀏覽器視窗。

開啟Full-Screen視訊

為了讓伺服器控制項讀取和寫入控制狀態,您必須採取三個步驟。

步驟 1:呼叫 RegisterRequiresControlState 方法

RegisterRequiresControlState 方法會通知 ASP.NET 控制項需要保存控制項狀態。 它會採用 Control 類型的一個引數,這是正在註冊的控制項。

請務必注意,註冊不會從要求持續存在。 因此,如果控制項是要保存控制項狀態,則必須在每個要求上呼叫這個方法。 建議在 OnInit 中呼叫 方法。

protected override void OnInit(EventArgs e) { Page.RegisterRequiresControlState(this); base.OnInit(e); }

步驟 2:覆寫 SaveControlState

SaveControlState 方法會儲存自上次回傳後控制項的控制項狀態變更。 它會傳回代表控制項狀態的物件。

步驟 3:覆寫 LoadControlState

LoadControlState 方法會將儲存的狀態載入控制項。 方法會採用 Object 類型的一個引數,該引數會保留控制項的儲存狀態。

完整 XHTML 合規性

任何 Web 開發人員都知道 Web 應用程式中標準的重要性。 為了維護以標準為基礎的開發環境,ASP.NET 2.0 完全符合 XHTML 規範。 因此,所有標記都會根據支援 HTML 4.0 或更新版本之瀏覽器的 XHTML 標準來轉譯。

ASP.NET 1.1 中的 DOCTYPE 定義如下所示:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN

在 ASP.NET 2.0 中,預設 DOCTYPE 定義如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

如果您選擇,您可以透過組態檔中的 xhtmlConformance 節點來改變預設 XHTML 合規性。 例如,web.config檔案中的下列節點會將 XHTML 合規性變更為 XHTML 1.0 Strict:

<xhtmlConformance mode="Strict" />

如果您選擇,您也可以將 ASP.NET 設定為使用 ASP.NET 1.x 中使用的舊版設定,如下所示:

<xhtmlConformance mode="Legacy" />

使用配接器進行調適型轉譯

在 ASP.NET 1.x 中,組態檔包含 < 已填入 HttpBrowserCapabilities 物件的 browserCaps > 區段。 此物件可讓開發人員判斷哪些裝置正在提出特定要求,並適當地轉譯程式碼。 在 ASP.NET 2.0 中,模型已改善,現在會使用新的 ControlAdapter 類別。 ControlAdapter 類別會覆寫控制項生命週期中的事件,並根據使用者代理程式的功能控制控制項的轉譯。 特定使用者代理程式的功能是由瀏覽器定義檔案所定義, (副檔名為 .browser 的檔案) 儲存在 c:\windows\microsoft.net\framework\v2.0.*\\CONFIG\Browser 資料夾中。

注意

ControlAdapter 類別是抽象類別。

就像 < 1.x 中的 browserCaps > 區段一樣,瀏覽器定義檔案會使用正則運算式來剖析使用者代理程式字串,以識別要求的瀏覽器。 它會定義該使用者代理程式的特定功能。 ControlAdapter 會透過 Render 方法轉譯控制項。 因此,如果您覆寫 Render 方法,就不應該在基類上呼叫 Render。 這樣做可能會導致轉譯發生兩次,一次用於介面卡,一次用於控制項本身。

開發自訂配接器

您可以從 ControlAdapter 繼承來開發自己的自訂配接器。 此外,您可以在頁面需要配接器的情況下繼承自抽象類別 PageAdapter。 控制項與自訂配接器的對應是透過 < 瀏覽器定義檔案中的 controlAdapters > 元素來完成。 例如,下列來自瀏覽器定義檔案的 XML 會將功能表控制項對應至 MenuAdapter 類別:

<controlAdapters> <adapter controlType="System.Web.UI.WebControls.Menu" adapterType="System.Web.UI.WebControls.Adapters.MenuAdapter" /> </controlAdapters>

使用此模型,控制項開發人員很容易就能以特定裝置或瀏覽器為目標。 開發人員也可以完全控制頁面在每個裝置上的呈現方式。

Per-Device轉譯

ASP.NET 2.0 中的伺服器控制項屬性可以使用瀏覽器特定的前置詞來指定每個裝置。 例如,下列程式碼會根據用來流覽頁面的裝置,變更標籤的文字。

<asp:Label ID="lblBrowser" runat="server" Text="You are browsing from an unknown device." ie:Text="You are browsing from Internet Explorer." mozilla:Text="You are browsing from Firefox."> </asp:Label>

從 Internet Explorer 流覽包含此標籤的頁面時,標籤會顯示文字,指出「您正在從 Internet Explorer 流覽」。當頁面從 Firefox 流覽時,標籤會顯示「您正在從 Firefox 流覽」文字。當頁面從任何其他裝置流覽時,會顯示「您正在從未知裝置流覽」。您可以使用這個特殊語法來指定任何屬性。

設定焦點

ASP.NET 1.x 開發人員經常詢問如何針對特定控制項設定初始焦點。 例如,在登入頁面上,讓使用者識別碼文字方塊在頁面第一次載入時取得焦點會很有用。 在 ASP.NET 1.x 中,執行此動作需要撰寫一些用戶端腳本。 雖然這類腳本是一項簡單的工作,但是由於 SetFocus 方法,ASP.NET 2.0 中已不再需要此腳本。 SetFocus 方法會採用一個引數,指出應該接收焦點的控制項。 這個引數可以是控制項的用戶端識別碼做為字串,或是伺服器控制項的名稱做為 Control 物件。 例如,若要在第一次載入頁面時,將初始焦點設定為名為 txtUserID 的 TextBox 控制項,請將下列程式碼新增至Page_Load:

if (!IsPostBack) {
    SetFocus(txtUserID);
}

--或

if (!IsPostBack) {
    SetFocus(txtUserID.ClientID);
}

ASP.NET 2.0 會使用先前) 所討論的 Webresource.axd 處理常式 (來轉譯設定焦點的用戶端函式。 用戶端函式的名稱WebForm_AutoFocus,如下所示:

<script type="text/javascript"> <!-- WebForm_AutoFocus('txtUserID'); // --> </script>

或者,您可以使用控制項的 Focus 方法,將初始焦點設定為該控制項。 Focus 方法衍生自 Control 類別,可供所有 ASP.NET 2.0 控制項使用。 當發生驗證錯誤時,也可以將焦點設定為特定控制項。 這將涵蓋在稍後的課程模組中。

ASP.NET 2.0 中的新伺服器控制項

以下是 ASP.NET 2.0 中的新伺服器控制項。 我們將在稍後的課程模組中深入瞭解其中一些。

ImageMap 控制項

ImageMap 控制項可讓您將熱點新增至可起始回傳或流覽至 URL 的影像。 有三種類型的熱點可供使用;CircleHotSpot、RectangleHotSpot 和 PolygonHotSpot。 熱點是透過 Visual Studio 中的集合編輯器或以程式設計方式在程式碼中新增。 沒有使用者介面可用於在影像上繪製熱點。 熱點的座標和大小或半徑必須以宣告方式指定。 設計工具中也沒有任何作用點的視覺標記法。 如果熱點設定為流覽至 URL,則會透過熱點的 NavigateUrl 屬性來指定 URL。 在回傳熱點的情況下,PostBackValue 屬性可讓您在回傳中傳遞可在伺服器端程式碼中擷取的字串。

[HotSpot 集合編輯器] 畫面的螢幕擷取畫面,顯示在 [預設點 A S P X 檔案] 視窗上。

圖 1:Visual Studio 中的 HotSpot 集合編輯器

BulletedList 控制項

BulletedList 控制項是可輕易系結資料的項目符號清單。 清單可以排序 (編號) 或透過 BulletStyle 屬性取消排序。 清單中的每個專案都是以 ListItem 物件表示。

未排序清單上 [項目符號清單] 工作下拉式功能表的螢幕擷取畫面,其中 [選擇資料來源] 選項停留在上方。

圖 2:Visual Studio 中的項目符號清單控制項

HiddenField 控制項

HiddenField 控制項會將隱藏的表單欄位新增至您的頁面,其值可在伺服器端程式碼中使用。 隱藏表單欄位的值通常預期會在回傳之間保持不變。 不過,惡意使用者可以在回傳之前變更值。 如果發生這種情況,HiddenField 控制項會引發 ValueChanged 事件。 如果您在 HiddenField 控制項中有敏感性資訊,而且想要確保它保持不變,您應該在程式碼中處理 ValueChanged 事件。

FileUpload 控制項

ASP.NET 2.0 中的 FileUpload 控制項可讓您透過 ASP.NET 網頁將檔案上傳至網頁伺服器。 此控制項與 ASP.NET 1.x HtmlInputFile 類別非常類似,但有一些例外狀況。 在 ASP.NET 1.x 中,建議您檢查 PostedFile 屬性是否為 null,以判斷您是否有良好的檔案。 ASP.NET 2.0 中的 FileUpload 控制項新增了可用於相同用途的新 HasFile 屬性,而且更有效率。

PostedFile 屬性仍然可供存取 HttpPostedFile 物件,但 HttpPostedFile 的某些功能現在可透過 FileUpload 控制項內建使用。 例如,若要在 ASP.NET 1.x 中儲存上傳的檔案,請在 HttpPostedFile 物件上呼叫 SaveAs 方法。 在 ASP.NET 2.0 中使用 FileUpload 控制項,您可以在 FileUpload 控制項本身上呼叫 SaveAs 方法。

2.0 行為 (的另一項重大變更,而且可能最重要的變更) 是,在儲存之前,不再需要將整個上傳的檔案載入記憶體。 在 1.x 中,上傳的任何檔案都會在寫入磁片之前完全儲存到記憶體中。 此架構可防止上傳大型檔案。

在 ASP.NET 2.0 中,HTTPRuntime 元素的 requestLengthDiskThreshold 屬性可讓您設定在記憶體中保留多少 KB,再寫入磁片。

重要事項:MSDN 檔 (和其他位置的檔) 指定此值是以位元組為單位, (不是 KB) ,預設值為 256。 此值實際上是以 KB 指定,預設值為 80。 藉由具有預設值 80K,我們可確保緩衝區不會在大型物件堆積上結束。

精靈控制項

ASP.NET 開發人員嘗試使用面板或從頁面傳輸到頁面,嘗試收集一系列「頁面」中的資訊相當常見。 比起不常,努力是令人沮喪的,而且相當耗時。 新的精靈控制項可藉由在使用者熟悉的精靈介面中允許線性和非線性步驟來解決問題。 精靈控制項會在一系列步驟中呈現輸入表單。 每個步驟都是由 控制項的 StepType 屬性所指定的特定類型。 可用的步驟類型如下所示:

步驟類型 說明
自動 精靈會根據步驟階層中的位置,自動判斷步驟的類型。
開始 第一個步驟,通常用來呈現簡介語句。
步驟 一般步驟。
[完成] 最後一個步驟,通常用來呈現按鈕來完成精靈。
完成 顯示通訊成功或失敗的訊息。

注意

精靈控制項會使用 ASP.NET 控制項狀態來追蹤其狀態。 因此,EnableViewState 屬性可以設定為 false,而不會有任何損害。

這段影片是精靈控制項的逐步解說。

精靈控制項影片逐步解說的螢幕擷取畫面。隨即會顯示具有 Microsoft Visual Studio 視窗的伺服器控制項畫面。

開啟Full-Screen視訊

當地語系化控制項

Localize 控制項類似于常值控制項。 不過,Localize 控制項具有 Mode 屬性,可控制新增至控制項的標記呈現方式。 Mode 屬性支援下列值:

模式 說明
轉換 標記會根據發出要求的瀏覽器通訊協定來轉換。
PassThrough 標記會依原狀呈現。
編碼 新增至控制項的標記會使用 HtmlEncode 進行編碼。

MultiView 和檢視控制項

MultiView 控制項可作為檢視控制項的容器,而 [檢視] 控制項可作為容器, (與其他控制項的 Panel 控制項) 非常類似。 MultiView 控制項中的每個檢視都是以單一檢視控制項來表示。 MultiView 中的第一個檢視控制項是檢視 0,第二個是檢視 1 等等。您可以指定 MultiView 控制項的 ActiveViewIndex 來切換檢視。

替代控制項

替代控制項會與 ASP.NET 快取搭配使用。 如果您想要利用快取,但您必須在每個要求上更新的頁面部分 (,換句話說,可豁免快取) 的頁面部分,替代元件會提供絕佳的解決方案。 控制項實際上不會自行轉譯任何輸出。 相反地,它會系結至伺服器端程式碼中的方法。 要求頁面時,會呼叫 方法,並轉譯傳回的標記來取代替代控制項。

替代控制項所系結的方法是透過 MethodName 屬性來指定。 該方法必須符合下列準則:

  • 它必須是 VB) 方法中共用的靜態 (。
  • 它會接受 HttpCoNtext 類型的一個參數。
  • 它會傳回字串,代表應該取代頁面上控制項的標記。

替代控制項無法修改頁面上的任何其他控制項,但可以透過其 參數存取目前的 HttpCoNtext。

GridView 控制項

GridView 控制項是 DataGrid 控制項的取代專案。 此控制項將在稍後的課程模組中更詳細地涵蓋。

DetailsView 控制項

DetailsView 控制項可讓您顯示資料來源中的單一記錄,以及編輯或刪除它。 稍後的課程模組會更詳細地討論。

FormView 控制項

FormView 控制項可用來在可設定的介面中顯示資料來源中的單一記錄。 稍後的課程模組會更詳細地討論。

AccessDataSource 控制項

AccessDataSource 控制項是用來系結 Access 資料庫的資料。 稍後的課程模組會更詳細地討論。

ObjectDataSource 控制項

ObjectDataSource 控制項是用來支援三層式架構,讓控制項可以系結至仲介層商務物件,而不是兩層式模型,其中控制項會直接系結至資料來源。 稍後的課程模組將更詳細地討論。

XmlDataSource 控制項

XmlDataSource 控制項是用來系結至 XML 資料來源的資料。 稍後的課程模組會更詳細地討論。

SiteMapDataSource 控制項

SiteMapDataSource 控制項會根據網站地圖提供網站導覽控制項的資料系結。 稍後的課程模組將更詳細地討論。

SiteMapPath 控制項

SiteMapPath 控制項會顯示一系列通常稱為階層連結的導覽連結。 稍後的課程模組會更詳細地討論。

功能表控制項會使用 DHTML 顯示動態功能表。 稍後的課程模組會更詳細地討論。

TreeView 控制項

TreeView 控制項可用來顯示資料的階層式樹狀檢視。 稍後的課程模組會更詳細地討論。

登入控制項

登入控制項提供登入網站的機制。 稍後的課程模組會更詳細地討論。

LoginView 控制項

LoginView 控制項允許根據使用者的登入狀態顯示不同的範本。 稍後的課程模組會更詳細地討論。

PasswordRecovery 控制項

PasswordRecovery 控制項可用來擷取 ASP.NET 應用程式使用者忘記的密碼。 稍後的課程模組會更詳細地討論。

LoginStatus

LoginStatus 控制項會顯示使用者的登入狀態。 稍後的課程模組會更詳細地討論。

LoginName

LoginName 控制項會在登入 ASP.NET 應用程式之後顯示使用者的使用者名稱。 稍後的課程模組會更詳細地討論。

CreateUserWizard

CreateUserWizard 是可設定的精靈,可讓使用者建立 ASP.NET 成員資格帳戶,以在 ASP.NET 應用程式中使用。 稍後的課程模組會更詳細地討論。

ChangePassword

ChangePassword 控制項可讓使用者變更 ASP.NET 應用程式的密碼。 稍後的課程模組會更詳細地討論。

各種網頁元件

ASP.NET 2.0 隨附各種網頁元件。 稍後的課程模組將詳細說明這些專案。