ASP.NET 2.0 中的主版頁面

来源:互联网 发布:windows xp32镜像下载 编辑:程序博客网 时间:2024/04/27 15:33

Stephen Walther
Superexpert

2004 年 8 月

適用於:
   Microsoft ASP.NET 2.0

主版頁面可讓您建立遵照一致佈景主題與樣式的 ASP.NET 頁面。Stephen Walther 將教您如何利用此新功能。

內容

簡介
主版頁面及內容頁面
建立簡單的主版頁面
建立簡單的內容頁面
使用網站巡覽建立主版頁面
巢狀化多個主版頁面s
設定主版頁面
覆寫主版頁面屬性
使用頁面標題屬性
覆寫 HTML 標頭屬性
公開主版頁面的屬性與方法
動態載入主版頁面
結論
相關書籍

簡介

主版頁面是 Microsoft ASP.NET 2.0 的新功能,它可讓您將相同的頁面配置套用至 Web 應用程式的多個內容頁面。主版頁面提供您一個輕鬆方法,可為網站建立一致的外觀及操作。

大部份的 Web 應用程式頁面都有標準的項目,例如標誌、巡覽功能表以及著作權注意事項。您可以在單一主版頁面中將這三個項目全部放入。如果您的應用程式中的內容頁面是根據主版頁面,則所有的內容頁面都將自動包括相同的標準項目。

在本文中,您將學習如何利用主版頁面來建立標準頁面配置。我們也將探討主版頁面的一些進階功能。例如,您將學習可如何修改標頭屬性,例如內容頁面的頁面標題及中繼標記。您也將學習如何在執行階段動態載入不同的主版頁面。

主版頁面及內容頁面

讓我們從建立簡單的主版頁面開始。您可以藉由使用「記事本」來建立主版頁面,或者,您可以利用 Microsoft Visual Web Developer,以便在建立主版頁面 (請參閱「圖 1」) 時獲得完全的設計工具支援。使用 Visual Web Developer 來建立主版頁面會比較有趣,但在本文中我不假設您使用 Visual Web Developer。

圖 1. 主版頁面的設計工具支援

建立簡單的主版頁面

建立主版頁面的方式與建立一般 ASP.NET 頁面的方法類似。主版頁面可以包含相同的 Web 控制項、User 控制項、HTML 內容以及您將加入至標準 ASP.NET 頁面的指令碼。在主版頁面與一般 ASP.NET 頁面之間有三個重要的差異。

首先,與一般 ASP.NET 頁面不同的是,主版頁面的名稱必須以特殊的副檔名 .master 結尾。這個副檔名標記該頁面為主版頁面。此外,設定了一個 ASP.NET 應用程式,因此您不能以 .master 副檔名要求頁面。直接要求主版頁面是不合理的。取而代之的是,您必須要求根據主版頁面的內容頁面。

其次,主版頁面包括 <%@ Master %> 指示詞,而不是一般的 <%@ Page %> 指示詞。<%@ Master %> 指示詞支援許多與 <%@ Page %> 指示詞相同的屬性。例如,您可以使用 <%@ Master Language="vb" %> 指示詞來指定頁面的程式設計語言。

主版頁面與一般 ASP.NET 頁面之間的最後一個差異,在於主版頁面可以包含零個或是更多的 ContentPlaceHolder 控制項。ContentPlaceHolder 控制項僅可在主版頁面內使用。此控制項可在主版頁面上標記一個可供特定內容頁面覆寫的區域。

名為 Simple.master 的「程式碼範例 1」中的主版頁面,包含具有兩個 ContentPlaceHolder 控制項的 HTML 表格。

程式碼範例 1. Simple.master

<%@ Master %><html><head>    <title>Simple Master Page</title></head><body><form id="form1" runat="server"><table width="100%"><tr>    <td>    <asp:ContentPlaceHolder         id="ContentPlaceHolder1"         runat="server" />    </td>    <td>    <asp:ContentPlaceHolder         id="ContentPlaceHolder2"         runat="server" />    </td></tr></table></form></body></html>

在「程式碼範例 1」的主版頁面中包含兩個名為 ContentPlaceHolder1ContentPlaceHolder2ContentPlaceHolder 控制項。這兩個控制項會在主版頁面上標記一些區域,以利修改特定內容頁面。如果您在 Visual Web Developer 設計工具內開啟「程式碼範例 1」中的主版頁面,您將看到「圖 2」中的頁面。

圖 2. Simple.master 主版頁面

請注意在「程式碼範例 1」中的主版頁面包含標準的開頭 HTML 標記。例如,它包含 HTML 的 <title> 與 <body> 標記。通常在主版頁面中都會有這些標準標記。在本文稍後 (在<覆寫主版頁面屬性>一節中),我們將討論如何在特定內容頁面中變更標題。

此外,請注意「主版頁面」包括伺服器端的 <form> 標記。由於在 ASP.NET 頁面中只允許一個伺服器端的 <form> 標記,所以您幾乎都會想要在主版頁面中包括此標記。

建立簡單的內容頁面

在您建立主版頁面後,您可以根據主版頁面建立一或多個內容頁面。內容頁面是您從 Web 瀏覽器要求的實際頁面。內容頁面與一般 ASP.NET 檔案一樣都有相同的 .aspx 副檔名。它與一般的 ASP.NET 頁面相似,不過有兩個非常重要的例外狀況。

首先,內容頁面中的所有內容都必須包含在 Content 控制項中。Content 控制項是用以將內容頁面中的內容區域對應到主版頁面中的 ContentPlaceHolder 控制項所標記的內容區域。

其次,內容頁面必須與主版頁面相關聯。您可以藉由使用 <%@ Page %> 指示詞的屬性將內容頁面與主版頁面相關聯。或者,您也可以使用 Web 組態檔將多個內容頁面與主版頁面相關聯。

例如,在「程式碼範例 2」中內容頁面所包含的兩個 Content 控制項,與「程式碼範例 1」中主版頁面內的兩個 ContentPlaceHolder 控制項相對應。

程式碼範例 2. Simple.aspx

<%@ Page MasterPageFile="~/Simple.master" %><asp:Content     ID="Content1"     ContentPlaceHolderID="ContentPlaceHolder1"     Runat="server">    Content in Left Column</asp:Content><asp:Content     ID="Content2"     ContentPlaceHolderID="ContentPlaceHolder2"     Runat="server">    Content in Right Column</asp:Content>

「程式碼範例 2」中的內容頁面在它的 <%@ Page %> 指示詞中包括 MasterPageFile 屬性。此屬性將內容頁面與「程式碼範例 1」 中的主版頁面相關聯。

請注意這兩個 Content 控制項都包括開頭與結尾標記之間的文字。在此情況下,Content 控制項僅僅包含文字。不過,您可以在 Content 控制項內加入任何所需的內容,包括 Web 控制項與 User 控制項。

當您編輯 Visual Web Developer 中的內容頁面時,您可以查看背景所建立的主版頁面映像 (請參閱「圖 3」)。Visual Web Developer 將會自動加入與主版頁面的每個 ContentPlaceHolder 相對應的 Content 控制項。

圖 3. 在 Visual Web Developer 中編輯內容頁面

使用網站巡覽建立主版頁面

在上一節所討論的主版頁面與內容頁面是過度簡化的。在實際的狀況中,您將會想要在主版頁面加入標準巡覽項目,例如功能表列以及麵包屑追蹤 (Bread Crumb Trail)。在本節中,我們將逐步解說關於建立更多實用主版頁面的程序 (請參閱「圖 4」)。

圖 4. 較複雜的主版頁面

我們的主版頁面將包含要用來巡覽的 SiteMapPath 控制項和 Menu 控制項。SiteMapPath 控制項會顯示麵包屑追蹤,而 Menu 控制項則會顯示巡覽功能表。這兩個控制項都將使用「程式碼範例 3」中的 SiteMap 檔案。

程式碼範例 3. web.sitemap

<?xml version="1.0" encoding="utf-8" ?><siteMap>    <siteMapNode url="~/Default.aspx" title="Home">   <siteMapNode url="~/Products.aspx" title="Products"/>   <siteMapNode url="~/Services.aspx" title="Services"/>    </siteMapNode></siteMap>

「程式碼範例 3」中的 SiteMap 檔案定義了三個節點:首頁、產品頁面以及服務頁面。每個節點都有一個 URL 以及指定的標題屬性。在「程式碼範例 4」中的主版頁面為它的 SiteMapPathMenu 控制項利用此檔案。

程式碼範例 4. NavMaster.master

<%@ Master %><html><head>    <title>NavMaster</title></head><body>    <form id="form1" runat="server">        <table             width="100%"            border="0"            cellpadding="5">        <tr>            <td colspan="2">            <asp:Image                 id="Image1"                ImageUrl="~/Logo.gif" Runat="Server" />            </td>        </tr>        <tr bgcolor="lightblue">            <td colspan="2">            <asp:SiteMapPath                 id="SiteMapPath1"                 Runat="Server" />                         </td>        </tr>        </table>        <table width="100%" cellpadding="10" border="0">        <tr>            <td valign="top" width="100" bgcolor="#eeeeee">            <asp:Menu                 id="Menu"                 Runat="Server"                 DataSourceID="SiteMapDataSource1"                 StaticDisplayLevels="2" />            </td>            <td valign="top">            <asp:contentplaceholder                 id="ContentColumn"                 runat="server" />            </td>            <td valign="top" width="100" bgcolor="#eeeeee">            <asp:ContentPlaceHolder                 id="AdColumn"                 runat="server">                <asp:Image                    ID="Ad1"                     ImageUrl="Ad1.gif"                    Runat="Server" />                <br />                <asp:Image                    ID="Ad2"                      ImageUrl="Ad2.gif"                    Runat="Server" />            </asp:ContentPlaceHolder>            </td>        </tr>        </table>             <small>All contents copyright &copy;   2004 by Microsoft Hair Stylists</small>        <asp:SiteMapDataSource ID="SiteMapDataSource1"   Runat="server" />    </form></body></html>

在「程式碼範例 4」中的主版頁面包含兩個 ContentPlaceHolder 控制項。第一個 ContentPlaceHolder 控制項是用來做為主頁面內容的預留位置,而第二個 ContentPlaceHolder 控制項則是用來做為廣告內容的預留位置。

第二個 ContentPlaceHolder 控制項包含預設的內容。它包含兩個用以顯示橫幅廣告的 Image 控制項 (請參閱「圖 5」)。在特定內容頁面中可以覆寫此預設內容。

圖 5. NavMaster.master 主版頁面

最後,在「程式碼範例 5」中的內容頁面是根據 NavMaster.master 主版頁面 (請參閱「圖 6」) 所建立。此頁面包含單一 Content 控制項,其中包含主版頁面主內容區域的內容。

圖 6. Products.aspx 頁面

程式碼範例 5. Products.aspx

<%@ Page MasterPageFile="~/NavMaster.master" %><asp:Content     ID="Content1"     ContentPlaceHolderID="ContentColumn"     Runat="server">    This is the Products.aspx page</asp:Content>

巢狀化多個主版頁面

到目前為止,我們已經看過如何建立單一主版頁面以及如何根據主版頁面來建立內容頁面。單一網站可以包含多個主版頁面。例如,您可以在網站中的不同區段建立不同的主版頁面。

此外,如果您有需要,您甚至可以巢狀化多個主版頁面。例如,您可以針對整個網站建立一個主版頁面,然後將主版頁面巢狀化至個別區段的網站主版頁面下。Visual Web Developer 並沒有為此工作提供設計工具支援。因此,如果您想要巢狀化主版頁面,您將需要遵照原始程式碼的檢視或使用「記事本」來建立頁面。

例如,在「程式碼範例 6」中的頁面可用於網站主版頁面。此主版頁面包含開頭和結尾 HTML 與 Form 標記,另外還包含單一 ContentPlaceHolder 控制項。

程式碼範例 6. SiteMaster.master

<%@ Master %><html><head>    <title>Site Master</title></head><body bgcolor="LightGreen">    <form id="form1" runat="server">        <h1>Site Master Page</h1>        <asp:contentplaceholder             id="SiteContentPlaceHolder"             runat="server" />    </form></body></html>

「程式碼範例 7」中的頁面是巢狀的主版頁面。這個主版頁面會覆蓋網站主版頁面中的內容。請注意 <%@ Master %> 指示詞是指 SiteMaster.master 主版頁面。

程式碼範例 7. SectionMaster.master

<%@ Master  MasterPageFile="~/SiteMaster.master" %><asp:content    ContentPlaceHolderID="SiteContentPlaceHolder"     runat="server">        <table width="100%" bgcolor="LightYellow">    <tr>        <td colspan="2">        <h1>Section Master Page</h1>        </td>    </tr>    <tr>        <td>        <asp:ContentPlaceHolder               id="LeftColumn"            Runat="Server" />                     </td>        <td>        <asp:ContentPlaceHolder               id="RightColumn"            Runat="Server" />             </td>    </tr>    </table>    </asp:content>

最後,在「程式碼範例 8」中的內容頁面是根據區段主版頁面所建立的。請注意此頁面會覆寫包含在區段主版頁面中的兩個 ContentPlaceHolder 控制項。

程式碼範例 8. NestedMasters.aspx

<%@ Page MasterPageFile="~/SectionMaster.master" %><asp:Content        ContentPlaceHolderId="LeftColumn"    Runat="Server">    This content appears in the left column</asp:Content><asp:Content       ContentPlaceHolderId="RightColumn"    Runat="Server">    This content appears in the right column</asp:Content>

解說完和做完所有的步驟後,就會呈現「圖 7」中的頁面。請注意已合併網站主版頁面與區段主版頁面的內容,以產生最後的內容頁面。網站主版頁面的內容會以綠色顯示,而區段主版頁面的內容則是以黃色顯示。

圖 7. 巢狀主版頁面

設定主版頁面

您不再需要使用 <%@ Page %> 指示詞來將內容頁面與主版頁面相關聯,而是可以在 Web 應用程式的組態檔中將主版頁面與內容頁面相關聯。使用組態檔能更輕易地維護大網站,因為您可以在單一位置中變更與許多內容頁面相關聯的主版頁面。

您可以在組態檔的 <pages> 項目中設定主版頁面。(此項目會出現在組態檔的 <system.web> 區段中)。例如,下列的 <pages> 項目將預設主版頁面設為 "SuperMaster.master":

<pages masterPageFile="SuperMaster.master" />

在組態檔中指派主版頁面時,您必須注意到兩點。首先,在內容頁面中設定主版頁面的優先順序高於組態檔中的任何主版頁面。因此,如果您想要使用 Web.Config 檔案來設定主版頁面,您不應該在內容頁面中包括 MasterPageFile 屬性。

其次,您的應用程式可以包含位於不同子資料夾中的多個 Web.Config 檔案以設定不同的主版頁面。換句話說,您可以藉由建立新的 Web.Config 檔案,以覆寫子資料夾中 Web.Config 檔案內所設定的主版頁面。

覆寫主版頁面屬性

有一個問題是您在使用主版頁面幾乎會立即遇到的,就是如何覆寫個別內容頁面中主版頁面的頁面標題與中繼標記這一類的屬性。一般而言,即使個別內容頁面是根據共用的主版頁面所建立,您還是會希望每個內容頁面都能顯示唯一的標題。

有數種方式可以覆寫特定內容頁面內主版頁面中所包含的內容。我們將在本節中一一討論這些方法。

使用頁面標題屬性

如果您只想從內容頁面中變更由主版頁面所呈現的頁面標題,則您可以利用 <%@ Page %> 指示詞的 Title 屬性。此屬性只有在主版頁面使用伺服器端的 HtmlHead 控制項時才會有作用。

例如,「程式碼範例 9」中的主版頁面包含伺服器端的 HtmlHead 控制項。

程式碼範例 9. TitleMaster.master

<%@ Master %><html><head runat="server">    <title>Master Title</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server" />    </form></body></html>

請注意「程式碼範例 9」中的 <head> 標記包括一個 runat="server" 屬性。此屬性會將 <head> 標記轉換成一個伺服器端的 HtmlHead 控制項。

「程式碼範例 10」中的內容頁面會覆寫頁面標題。請注意在此頁面最上方的 <%@ Page %> 指示詞有一個供它的 Title 屬性使用的值。當顯示此頁時,頁面標題會顯示成「內容頁面標題」的文字。

程式碼範例 10. TitleContent.aspx

<%@ Page MasterPageFile="~/TitleMaster.master" Title="Content Page Title" %><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">        Here is some content    </asp:Content>

覆寫 HTML 標頭屬性

如果您需要覆寫 HTML 標頭的其他屬性,例如中繼標記或樣式標記,您可以直接參考內容頁面的 HtmlHead 項目。HtmlHead 控制項可以實作 IPageHeader 介面,它包括下列的特性:

  • LinkedStyleSheets—連結到 HTML 頁面的外部樣式表。
  • Metadata— 中繼資料標記的集合。
  • StyleSheet—代表套用到 HTML 頁面的樣式。
  • Title—HTML 頁面的標題。

您可以修改內容頁面中的任一屬性。例如,「程式碼範例 11」中的主版頁面包括可在內容頁面中可被覆寫的伺服器端 HtmlHead 控制項。

程式碼範例 11. HeaderMaster.master

<%@ Master %><html><head runat="server">    <title>Master Title</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server" />    </form></body></html>

「程式碼範例 12」中的內容頁面修改了 HtmlHead 控制項的 TitleMetadata 屬性以顯示自訂內容。

程式碼範例 12. HeaderContent.aspx (Microsoft Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/HeaderMaster.master" %><script runat="server">    Sub Page_Load()        Master.Page.Header.Title = "Content Title"        Master.Page.Header.Metadata.Add("Keywords", "blah,blah")        Master.Page.Header.Metadata.Add("Description", "blah,blah")    End Sub    </script><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">        Here is some content        </asp:Content> 

程式碼範例 12. HeaderContent.aspx (c#)

<%@ Page Language="c#" MasterPageFile="~/HeaderMaster.master" %><script runat="server">    void Page_Load() {        Master.Page.Header.Title = "Content Title";        Master.Page.Header.Metadata.Add("Keywords", "blah,blah");        Master.Page.Header.Metadata.Add("Description", "blah,blah");    }    </script><asp:Content ID="Content1"    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">        Here is some content        </asp:Content>

Page 物件的 Master 屬性是指內容頁面的主版頁面 (如果您真的想要使用,請使用 Page.Master 而不是 Master)。Header 屬性是指 HtmlHead 項目。在「程式碼範例 12」中的內容頁面會修改 HtmlHead 控制項的 TitleMetadata 屬性。

公開主版頁面的屬性與方法

如果您需要擁有更多主版頁面內容的控制權,您可以從主版頁面公開屬性與方法。您可以在內容頁面中修改主版頁面所公開的公用屬性。您可以在內容頁面中呼叫主版頁面所公開的公用方法。

例如,想像一下,您想要修改內容頁面內主版頁面頁尾的內容。在「程式碼範例 13」的主版頁面中公開了名為 Footer 的公用屬性。

程式碼範例 13. FooterMaster.master (Visual Basic .NET)

<%@ Master Language="VB" %><script runat="server">    Private _footer As String        Public Property Footer() As String        Get            Return _footer        End Get        Set(ByVal value As String)            _footer = value        End Set    End Property    </script><html><head runat="server">    <title>Footer Master</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server" />    <br />    <small><%= _footer %></small>    </form></body></html>

程式碼範例 13. FooterMaster.master (C#)

<%@ Master Language="C#" %><script runat="server">    private string _footer;        public string Footer {        get {            return _footer;        }        set {            _footer = value;        }    }    </script><html><head id="Head1" runat="server">    <title>Footer Master</title></head><body>    <form id="form1" runat="server">    <asp:contentplaceholder         id="ContentPlaceHolder1"         runat="server" />    <br />    <small><%= _footer %></small>    </form></body></html>

在「程式碼範例 13」中,公用 Footer 屬性會修改私用欄位 named _footer。private _footer 欄位是使用內嵌運算式 <%= _footer %> 顯示在主版頁面的底部。

在「程式碼範例 14」中的內容頁面會設定 Footer 屬性。Footer 屬性是由 Page 物件的 Master 屬性所公開。一般而言,Master 屬性代表 MasterPage 物件。不過,此內容頁面包括 <%@ MasterType %> 指示詞,可將 Master 屬性的值轉換為 FooterMaster 物件。

程式碼範例 14. FooterContent.aspx (Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/FooterMaster.master" %><%@ MasterType VirtualPath="~/FooterMaster.master" %><script runat="server">    Sub Page_Load()        Master.Footer = "Custom Page Footer"    End Sub    </script><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is some content    </asp:Content>

程式碼範例 14. FooterContent.aspx (C#)

<%@ Page Language="C#" MasterPageFile="~/FooterMaster.master" %><%@ MasterType VirtualPath="~/FooterMaster.master" %><script runat="server">    void Page_Load() {        Master.Footer = "Custom Page Footer";    }    </script><asp:Content ID="Content1"    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is some content    </asp:Content>

透過在主版頁面中公開屬性與方法,您可以修改呈現主版頁面的任一層面。

動態載入主版頁面

在最後一節中,我們將看一下主版頁面的進階應用。將探討如何在執行階段動態載入不同的主版頁面。

在某些情況下,動態載入主版頁面非常有用。首先,您可能需要將您的網站與一或多個合作夥伴的網站結合在一起。當某些人從合作夥伴網站連結到您的網站時,您可能會想要自動載入符合合作夥伴網站外觀和操作的主版頁面。

另一個您會想要動態載入主版頁面的情況是,當您希望您的應用程式的使用者可以選取頁面配置。您可以提供使用者一組標準的主版頁面。您的應用程式使用者就可以透過選取他們最喜愛的主版頁面,來選取最喜愛的頁面配置。

您可以藉由將值指派到 Page 物件的 MasterPageFile 屬性以動態的載入一個主版頁面。指派給此屬性的值應該是有效的主版頁面檔案的相關路徑。

當使用 MasterPageFile 屬性時您必須注意有一個重要的限制。您只能在 Page PreInit 事件發生之前或期間指派值給此屬性。PreInit 是在頁面執行週期的期間最早發生的事件。如果您嘗試在較後面發生的事件 (例如 Page Load 事件) 之期間將值指派給此屬性,您將會收到例外狀況。此限制很合理,因為不同的主版頁面將會導致將不同組的控制項載入頁面。

在「程式碼範例 15」中的內容頁面利用 MasterPageFile 屬性在執行階段動態載入不同的主版頁面。

程式碼範例 15. DynamicContent.aspx (Visual Basic .NET)

<%@ Page Language="VB" MasterPageFile="~/DynamicMaster1.master" %><script runat="server">        Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs)        MasterPageFile = Profile.Master    End Sub</script><asp:Content    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is the content</asp:Content> 

程式碼範例 15. DynamicContent.aspx (C#)

<%@ Page Language="c#" MasterPageFile="~/DynamicMaster1.master" %><script runat="server">        void Page_PreInit(Object sender, EventArgs e) {        MasterPageFile = Profile.Master;    }</script><asp:Content ID="Content1"    ContentPlaceHolderID="ContentPlaceHolder1"    Runat="Server">    Here is the content</asp:Content>

在「程式碼範例 15」中,在 PreInit 事件中動態載入了主版頁面。在此情況下,會從使用者的設定檔載入主版頁面檔案的路徑。您可以使用設定檔以持續儲存與使用者相關的資訊。這樣一來,雖然使用者在應用程式中往返於不同的頁面,使用者所選取的主版頁面仍然不會遺失。

為了能夠利用使用者設定檔,您需要將下列的組態設定值加入應用程式 Web.Config 檔案的 <system.web> 區段中:

<anonymousIdentification enabled="true" />      <profile> <properties>    <add    name="Master"     allowAnonymous="true"    defaultValue="DynamicMaster1.master" /> </properties> </profile>

這些設定值會建立名為 Master 的新 Profile 屬性,可供匿名和驗證的使用者使用。

「程式碼範例 15」中的內容頁面載入了名為 DynamicMaster1.master 與 DynamicMaster2.master 兩個主版頁面的其中之一。DynamicMaster1.master 的原始程式碼是包含在「程式碼範例 16」,而 DynamicMaster2.master 的原始程式碼則是包含在「程式碼範例 17」。這些主版頁面除了有不同的名稱和顯示不同的背景顏色之外,基本上它們是相同的。

程式碼範例 16. DynamicMaster1.master (Visual Basic .NET)

<%@ Master Language="vb" %><script runat="server">    Sub Page_Load()        If Not IsPostBack Then            dropMaster.SelectedValue = Profile.Master        End If    End Sub        Sub SelectMaster(ByVal s As Object, ByVal e As EventArgs)        Profile.Master = dropMaster.SelectedValue        Response.Redirect(Request.Path)    End Sub    </script><html><head>    <title>Dynamic Master 1</title></head><body bgcolor="LightYellow"><form runat="server"><h1>Dynamic Master 1</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"     Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server" /></form></body></html>

程式碼範例 16. DynamicMaster1.master (C#)

<%@ Master Language="c#" %><script runat="server">        void Page_Load() {        if (!IsPostBack)            dropMaster.SelectedValue = Profile.Master;        }        void SelectMaster(Object s, EventArgs e) {        Profile.Master = dropMaster.SelectedValue;        Response.Redirect(Request.Path);    }    </script><html><head>    <title>Dynamic Master 1</title></head><body bgcolor="LightYellow"><form id="Form1" runat="server"><h1>Dynamic Master 1 CS</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"     Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server" /></form></body></html>

程式碼範例 17. DynamicMaster2.master (Visual Basic .NET)

<%@ Master Language="vb" %><script runat="server">    Sub Page_Load()        If Not IsPostBack Then            dropMaster.SelectedValue = Profile.Master        End If    End Sub        Sub SelectMaster(ByVal s As Object, ByVal e As EventArgs)        Profile.Master = dropMaster.SelectedValue        Response.Redirect(Request.Path)    End Sub    </script><html><head>    <title>Dynamic Master 2</title></head><body bgcolor="LightGreen"><form id="Form1" runat="server"><h1>Dynamic Master 2</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"    Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server" /></form></body></html>

程式碼範例 17. DynamicMaster2.master (C#)

<%@ Master Language="c#" %><script runat="server">        void Page_Load() {        if (!IsPostBack)            dropMaster.SelectedValue = Profile.Master;        }        void SelectMaster(Object s, EventArgs e) {        Profile.Master = dropMaster.SelectedValue;        Response.Redirect(Request.Path);    }    </script><html><head>    <title>Dynamic Master 2</title></head><body bgcolor="LightGreen"><form id="Form1" runat="server"><h1>Dynamic Master 2 CS</h1><p><asp:DropDownList     id="dropMaster"    AutoPostBack="true"    OnSelectedIndexChanged="SelectMaster"     ValidationGroup="Master"    Runat="Server">    <asp:ListItem Text="Dynamic 1" value="DynamicMaster1.master" />    <asp:ListItem Text="Dynamic 2" value="DynamicMaster2.master" /></asp:DropDownList></p><asp:contentplaceholder     id="ContentPlaceHolder1"     runat="server" /></form></body></html>

兩個主版頁面都包含 DropDownList 控制項,可讓使用者選取特定主版頁面。當使用者選取一個主版頁面時,就會呼叫 SelectMaster 方法。此方法會將選取的主版頁面指派到使用者設定檔並重新載入目前的頁面。這是因為新選取的主版頁面必須在 PreInit 事件期間載入,所以需要重新載入該頁面。

結論

我個人覺得,主版頁面是 ASP.NET 2.0 中我最喜愛的新功能。此新功能對於未來我將如何建立 ASP.NET 應用程式將有重大的影響。現在,我不斷地在使用者控制項 (糟透了) 或是自訂基礎 Page 類別 (真的很糟) 之間摸索以建立可重複使用的頁面配置。主版頁面提供您全新且直覺的方式來建立可重複使用的頁面配置。而且,最好的一點是,Microsoft Visual Studio .NET 2005 提供您完整的設計工具支援,讓您在建立它們時能夠看到頁面實際的外觀。