我們其實可以把一些需要在頁面中共用的變數放在 MasterPage 中,以簡化各頁面中不斷重複的程式碼,例如:登入者資訊、共用的頁面資料、...等資料。
如果要在頁面(Page)中存取MasterPage中的控制項是可以用 this.Master.FindControl 取得,不過要取得 Master 中的物件就必須注意以下幾點:
1. ASPX 頁面必須宣告 <%@ MasterType %> 明確指出該頁面參考到的 MasterPage 類別在哪裡
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" %>
<%@ MasterType VirtualPath="~/MasterPage.master" %>
2. 透過 ASP 命名空間取得 MasterPage 類別
ASP.masterpage_master PageMaster = this.Master as ASP.masterpage_master;
備註:這個 ASP 命名空間是 ASP.NET 動態編譯機制內建的命名空間,任何透過參考進來的 MasterPage 或 UserControl 都可以透過這個 ASP 命名空間取得物件,你如果在 Visual Studio 中使用 ASP. 就可以透過 Intellisense 得知該頁面可以存取哪些類別了。
這樣一來你就可以在頁面中透過 PageMaster 物件取得在 Masterpage.master 中所定義的所有物件了,範例如下:
MasterPage
<%@ Master Language="C#" %>
<%@ Import Namespace="System.Linq" %>
<script runat="server">
public MyDataContext db;
public ProductModel m = new ProductModel();
protected void Page_Load(object sender, EventArgs e)
{
db = new MyDataContext();
var q = from p in db.ProductModel
where p.ID.CompareTo(new Guid(Request.QueryString["id"])) == 0
select p;
m = q.First();
if (m == null)
{
Response.Redirect("/", true);
}
}
</script>
ASPX Page
<%@ Page Language="C#" MasterPageFile="~/MasterPageProductModel.master" %>
<%@ MasterType VirtualPath="~/MasterPageProductModel.master" %>
<%@ Import Namespace="System.Linq" %>
<script runat="server">
protected ProductModel m = new ProductModel();
protected void Page_Load(object sender, EventArgs e)
{
ASP.masterpageproductmodel_master ProductModelMaster =
this.Master as ASP.masterpageproductmodel_master;
m = ProductModelMaster.m;
}
</script>
以上的範例可以讓你同時在 MasterPage 與 ASPX 頁面裡同時使用同一個 m 變數,這樣子你在套版的時候程式碼就會乾淨許多,例如:
<h3><%= m.Title %></h3>
<p>
<%= m.Summary %>
</p>
這樣是不是簡潔許多呢!