The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

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

我們在 MasterPage 中的程式是會比 Page 中的程式還早執行的,所以我們其實可以把一些頁面中共用的變數其中放置在 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">
   1:  
   2:     public MyDataContext db;
   3:     public ProductModel m = new ProductModel();
   4:     protected void Page_Load(object sender, EventArgs e)
   5:     {
   6:         db = new MyDataContext();
   7:         var q = from p in db.ProductModel
   8:                 where p.ID.CompareTo(new Guid(Request.QueryString["id"])) == 0
   9:                 select p;
  10:         m = q.First();
  11:         if (m == null)
  12:         {
  13:             Response.Redirect("/", true);
  14:         }
  15:     }
</script>

ASPX Page

<%@ Page Language="C#" MasterPageFile="~/MasterPageProductModel.master" %>
<%@ MasterType VirtualPath="~/MasterPageProductModel.master" %>
<%@ Import Namespace="System.Linq" %>
<script runat="server">
   1:  
   2:     protected ProductModel m = new ProductModel();
   3:     protected void Page_Load(object sender, EventArgs e)
   4:     {
   5:         ASP.masterpageproductmodel_master ProductModelMaster = 
   6:              this.Master as ASP.masterpageproductmodel_master;
   7:         m = ProductModelMaster.m;
   8:     }
</script>

以上的範例可以讓你同時在 MasterPage 與 ASPX 頁面裡同時使用同一個 m 變數,這樣子你在套版的時候程式碼就會乾淨許多,例如:

<h3><%= m.Title %></h3>
<p>
    <%= m.Summary %>
</p>

這樣是不是簡潔許多呢!