The Will Will Web

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

在 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>

這樣是不是簡潔許多呢!

留言評論