﻿# 在 ASP.NET 頁面中取得 MasterPage 的具型別物件資料

我們其實可以把一些需要在頁面中共用的變數放在 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>
```

這樣是不是簡潔許多呢！
