2011年11月3日 星期四

動態切換 Master Page

隨著心情、節日或角色而變換網頁色系,似乎蠻符合鮮明的個人風格。這樣的需求,換一換 css 應該就可以完成。但如果連排版也要重新建構,例如由原先的 Menu Bar放左邊,改成 Menu Bar 放上面,這樣 ... 心情就不會再美麗了。


樣板A
樣板B
為了能夠動態(或根據某些條件)來切換網頁樣板,有個比較簡單的方式,就是透過 Master Page 的更換來完成。也就是說,事先設計好幾個 Master Page A, B, C, D ...,最後根據某個規則來載入適當的 Master Page 就可以達成簡單的樣板切換功能了。而每個樣板所需要的 CSS 或 javascript ,也可以依據不同的 Master Page 而各自撰寫。

自己參考了 Ryan 的 「Dynamically Loading Master Pages in ASP.NET 2.0」文章,整理了一些測試程式。


首先建立 Dynamic 類別,為了讓需要動態切換的頁面來繼承。在程式中,是假設日後的樣板資訊是留存在 DB ,所以這邊會去 DB 抓資料回來。
 
namespace CMaster
{
    public class Dynamic:System.Web.UI.Page
    {
        protected override void OnPreInit(EventArgs e)
        {
            string strMaster = GetMasterFromDB();

            if (!strMaster.Equals(string.Empty))
            {
                base.MasterPageFile = strMaster;
            }

            base.OnPreInit(e);
        }


        //模擬從 DB 抓取 Master 設定
        private string GetMasterFromDB()
        {
            return "~/SK02.Master";
        }
    }
}
接著將需要動態切換 Master Page 的頁面,將其頁面的繼承改為 Dynamic ,以自己的範例來說,就是修改 MyPage.cs 如下:
namespace CMaster
{
    public partial class MyPage : Dynamic
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}
這裡將 原先的 public partial class MyPage : System.Web.UI.Page 改成
 public partial class MyPage : Dynamic

如此就可以完成動態切換 Master Page 的需求了。

在 Ryan 的文章中有提到透過設定 web.config 的 pageBaseType 可以達到一次設定所有頁面都支援動態切換 Master Page,但使用這方法要注意,你的程式必須是使用 Inline mode 開發,如果是使用 Code Behind (預設都是採 Code Behind),則設定 web.config 這種方式就會失效囉。



參考:

沒有留言:

張貼留言