如何將Web Form手動改成使用主版頁面的Web Form

如何將Web Form手動改成使用主版頁面的Web Form

自從ASP.NET 2.0開始ASP.NET支援Master Page的設計模式,讓Developer可以很方便建立一致化風格的頁面,Master Page儼然成為使用HTML Frame的另一種選擇,雖然這篇文章有點落伍,不過我想還是有些人有需要把既有的Web Form套用Master Page,本文針對上述需求說明如下:

下圖為本文所使用的Master Page的設計畫面及程式碼:

image

   1:  <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="MySite.master.cs" Inherits="MasterPageDemo.MySite" %>
   2:   
   3:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   4:   
   5:  <html xmlns="http://www.w3.org/1999/xhtml">
   6:  <head runat="server">
   7:      <title></title>
   8:      <asp:ContentPlaceHolder ID="head" runat="server">
   9:      </asp:ContentPlaceHolder>
  10:  </head>
  11:  <body>
  12:      <form id="form1" runat="server">
  13:      <div>
  14:          <h1>
  15:              這是一個主版網頁。
  16:          </h1>
  17:          <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
  18:          
  19:          </asp:ContentPlaceHolder>
  20:      </div>
  21:      </form>
  22:  </body>
  23:  </html>

Master Page主要用來設計整個Web應用程式一致性的外觀,對於每個頁面需要有各自的內容可以透過Master Page上放置ContentPlaceHolder的方式來呈現,預設建立Master Page項目時會包含ID為head和ContentPlaceHolder1的ContentPlaceHolder,以Visual Studio 2010為例,要套用Master Page的步驟如下:

  • 從方案總管中選取專案,接著選擇【專案>加入新項目】。

image

  • 於加入新項目視窗中選擇【使用主版頁面的Web Form】後按新增(注意:若選Web Form則不會套用Master Page)。

image

  • 於【選取主版頁面】視窗中選擇要套用的的Master Page後按確定。

image

  • 接著就會看到如下列的程式碼:
   1:  <%@ Page Title="" Language="C#" MasterPageFile="~/MySite.Master" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" 
   2:                   Inherits="MasterPageDemo.WebForm2" %>
   3:  <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
   4:  </asp:Content>
   5:  <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   6:  </asp:Content>
  • 為示範效果比較明顯,我在Content2底下放幾個控制項,程式碼修改後如下:
   1:  <%@ Page Title="" Language="C#" MasterPageFile="~/MySite.Master" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" 
   2:                    Inherits="MasterPageDemo.WebForm2" %>
   3:  <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
   4:  </asp:Content>
   5:  <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   6:       <h1>
   7:          這是一個內容網頁。        
   8:      </h1>
   9:      <br />
  10:      <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
  11:      <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  12:      <asp:Button ID="Button1" runat="server" Text="Button" />
  13:  </asp:Content>
  • 執行結果如下:

image

  • 假設在建立新項目時選成Web Form,一樣為示範效果,我加了跟上述Content Page一樣的控制項於Web Form中,程式碼如下:
   1:  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebPage.aspx.cs" 
   2:    Inherits="MasterPageDemo.WebPage" %>
   3:   
   4:  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   5:   
   6:  <html xmlns="http://www.w3.org/1999/xhtml">
   7:  <head runat="server">
   8:      <title></title>
   9:  </head>
  10:  <body>
  11:      <form id="form1" runat="server">
  12:      <div>
  13:              <h1>
  14:                  這是一個網頁。
  15:              </h1>
  16:              <br />
  17:              <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
  18:              <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  19:              <asp:Button ID="Button1" runat="server" Text="Button" />
  20:      </div>
  21:      </form>
  22:  </body>
  23:  </html>
  • 執行結果如下:

image

以上為本文所設定的LAB,接下來將進入本文的重點,將Web Form手動調整成套用Master Page,步驟如下:

  • 由於Master Page已經有form了,而且一個asp.net網頁只能有一個form,所以把html、head、body和form都拿掉,只保留Page指示詞及div,修改後程式碼如下
   1:  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebPage.aspx.cs" Inherits="MasterPageDemo.WebPage" %>
   2:   
   3:  <div>
   4:          <h1>
   5:              這是一個網頁。
   6:          </h1>
   7:          <br />
   8:          <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
   9:          <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  10:          <asp:Button ID="Button1" runat="server" Text="Button" />
  11:  </div>
  • 接著於Page指示詞中加入MasterPageFile="~/MySite.Master",用來設定Conetnt Page要套用至MySite.Master這個Master Page。
  • 接著手動輸入<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1">把div包起來。
   1:  <asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1">
   2:      <div>
   3:          <h1>
   4:              這是一個網頁。
   5:          </h1>
   6:          <br />
   7:          <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
   8:          <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
   9:          <asp:Button ID="Button1" runat="server" Text="Button" />
  10:  </div>
  11:  </asp:Content>
  • 輸入【Ctrl + F5】執行網頁,執行結果如下:

image

  • 完整程式碼如下:
   1:  <%@ Page Language="C#" MasterPageFile="~/MySite.Master" AutoEventWireup="true" CodeBehind="WebPage.aspx.cs" Inherits="MasterPageDemo.WebPage" %>
   2:   
   3:  <asp:Content ID="head" runat="server" ContentPlaceHolderID="head"></asp:Content>
   4:  <asp:Content ID="Content1" runat="server" ContentPlaceHolderID="ContentPlaceHolder1">
   5:      <div>
   6:          <h1>
   7:              這是一個網頁。
   8:          </h1>
   9:          <br />
  10:          <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
  11:          <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  12:          <asp:Button ID="Button1" runat="server" Text="Button" />
  13:  </div>
  14:  </asp:Content>
  15:   

 

PS:上述程式碼中第3列如果沒用到可以不用加入。

 

【參考資料】