none
變更MASTERPAGE

    問題

  •  

    假設我現在有2個MASTERPAGE  A和B

    而我原本的網頁都是套用A

    請問有什麼方法可以讓使用者再瀏覽時可以自己變更成A或B

    我看董大的書 好像只能改單個頁面

    要怎樣能改成 原本弄A的所有頁面

    都改成B的

    2007年12月4日 上午 10:29

解答

  •  歿魂 寫信:

    我新增一個頁面main.aspx 依照上面的程式碼

    擺上2個button來切換 A B MasterPage的樣式

    main頁面按下B樣式的鈕後 頁面確實會從A樣是換成B

    但是連結到其他頁面的時候

    還是會跑到原來的A樣式去

    這樣無法達到原本想藉由切換來讓原本都是以A MasterPage網頁變成B  MasterPage

    還是這要搭配參考Will 保哥所說的方法嗎?
    但是我看不懂他所說的方法- -

     

    請看一下這篇:http://www.purecs.net/thread/topic290_1.aspx

     

    你可以將更換 MasterPage 的程式寫在 Page_PreInit 事件裡,當你將 Page_PreInit 事件寫在 BasePage 裡的話,每一頁都繼承這個 BasePage 後,就不需要每一頁加上這個事件了,所以你只要改一次全部都改了,也可以寫一些判斷條件在這裡,動態的來切換不同的 MasterPage。

     

    不知道這樣子說你瞭解嗎?


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

    2007年12月5日 下午 12:39
  • 我是將 MatserPage 的資訊存在 Seeson ,但是實作上可以存在 Profile 或是自己定義的資料表...

    依照每個帳號所選的 MasterPage 來改變,Theme 作法亦然。

     

    玩玩看吧...

     

    App_Code\BasePage.cs

    程式碼區塊

    using System;
    using System.Web.UI;

     

    public class BasePage : Page
    {
        protected override void OnPreInit(EventArgs e)
        {

            // 將 MasterPage 的名稱記在 Session
            if (Session["Master"] != null)
            {
                MasterPageFile = Session["Master"].ToString();
            }
            else
            {
                MasterPageFile = "~/MasterPage.master";
            }
        }
    }

     

    MasterPage: MasterPage.masterMasterPage2.master :

    內容略....

     

    Defalut2.aspx

    程式碼區塊




    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>



     



    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>




    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        <asp:Button ID="Button1" runat="server" Text="Button"
        onclick="Button1_Click" />
        <asp:Button ID="Button2" runat="server" Text="Button"
        onclick="Button2_Click" />
    </asp:Content>



     

     

     

    Default2.aspx.cs

    程式碼區塊

    using System;
    using System.IO;

     

    public partial class Default2 : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

     

        // 切換 MasterPage

        protected void Button1_Click(object sender, EventArgs e)
        {
            Session["Master"] = "~/MasterPage2.master";
            Response.Redirect(Path.GetFileName(Request.CurrentExecutionFilePath));
        }

     

        // 換頁

        protected void Button2_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default3.aspx");
        }
    }

     

     

    Default3.aspx

    程式碼區塊


    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3"  %>

     

    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    </asp:Content>


     

     

     

    Default3.aspx.cs

    程式碼區塊

    using System;

     

    public partial class Default3 : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }

     

    2007年12月6日 上午 05:52

所有回覆

  • 程式碼區塊
    Sub Page_PreInit(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreInit
        Me.MasterPageFile = "~/NewMaster.master"
    End Sub

     

     

     

    2007年12月4日 上午 10:47
  • 在 web.config 的 裡可以宣告全站共用的 BasePage 類別,包括 UserControl 也可以在這裡定義,你可以在 BasePage 類別中的 Page_PreInit 變更 MasterPage 的路徑!

      

    程式碼區塊

     

             <pages pageBaseType="BasePage" userControlBaseType="BaseUserControl">

             </pages> 

     

     

    附上MSDN上的詳細說明:http://msdn2.microsoft.com/zh-tw/library/950xf363(VS.80).aspx

     

    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享 

     

    2007年12月4日 上午 10:50
  • 請問一下

    這樣可以使用BUTTON來變換嗎?

    意思是這樣

    假如我有一個變更樣式的按鈕

    按了之後會連結到一個頁面

    上面會有2個按鈕 分別是選擇A樣式的MasterPage 以及B樣式的MasterPage

    只要按了變成B樣式的按鈕 原本都是套用A樣式的都會轉變成B

    2007年12月4日 下午 04:05
  • 您可以試看看下列作法:

    程式碼區塊

    Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click

            Response.Redirect(Me.Request.Url.AbsolutePath & "?Type=1")

        End Sub

     

        Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click

            Response.Redirect(Me.Request.Url.AbsolutePath & "?Type=2")

        End Sub

     

        Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit

            If Request.QueryString("Type") IsNot Nothing AndAlso Request.QueryString("Type").ToString() = "2" Then

                Me.MasterPageFile = "MasterPage2.master"

            Else

                Me.MasterPageFile = "MasterPage.master"

            End If

        End Sub

     

     

    2007年12月4日 下午 06:11
  • 我新增一個頁面main.aspx 依照上面的程式碼

    擺上2個button來切換 A B MasterPage的樣式

    main頁面按下B樣式的鈕後 頁面確實會從A樣是換成B

    但是連結到其他頁面的時候

    還是會跑到原來的A樣式去

    這樣無法達到原本想藉由切換來讓原本都是以A MasterPage網頁變成B  MasterPage

    還是這要搭配參考Will 保哥所說的方法嗎?
    但是我看不懂他所說的方法- -
    2007年12月5日 上午 06:23
  • 連結中有提到:

    <pages    
       buffer="[True|False]"
       enableEventValidation="[True|False]"
       enableSessionState="[True|False|ReadOnly]"
       enableViewState="[True|False]"
       enableViewStateMac="[True|False]"
       smartNavigation="[True|False]"
       autoEventWireup="[True|False]"
       pageBaseType="typename, assembly"
       userControlBaseType="typename"
       validateRequest="[True|False]"
       masterPageFile="file path"
       theme="string"
       styleSheetTheme="string"
       maxPageStateFieldLength="number"
       compilationMode="[Always|Auto|Never]"
       pageParserFilterType="string"
       viewStateEncryptionMode="[Always|Auto|Never]"
       maintainScrollPositionOnPostBack="[True|False]"
       asyncTimeout="number"
    >

    這裡就是把每個aspx中的設定統一拿到web.config中設定(全域的設定)。

    這裡你只要在按鈕選擇完後,去修改web.config中的設定就可以達到您的需求

    只是有個地方要注意,Web.config修改後,session會消失

    2007年12月5日 上午 06:59
  • 除非萬不得已,才要讓程式去修改 Web.config。

    但要注意,Web.config 會影響全域(所有的使用者),

    而且會造成 Web 應用程式的重載,已經存在的 Session 會消失。

     

    否則,就利用每一頁的 Page_PreInit 來修改 Master Page。
    2007年12月5日 上午 07:32
  • 意思是說只能一個頁面一個頁面的來設更換的動作

    是比較安全的方法?

    2007年12月5日 上午 07:39
  • 如果你不想要 Web 應用程式一天到晚重載的話,就只能這樣做了。

    提供你一個思考方向:

    http://west-wind.com/weblog/posts/3016.aspx

     

    2007年12月5日 上午 07:46
  •  歿魂 寫信:

    我新增一個頁面main.aspx 依照上面的程式碼

    擺上2個button來切換 A B MasterPage的樣式

    main頁面按下B樣式的鈕後 頁面確實會從A樣是換成B

    但是連結到其他頁面的時候

    還是會跑到原來的A樣式去

    這樣無法達到原本想藉由切換來讓原本都是以A MasterPage網頁變成B  MasterPage

    還是這要搭配參考Will 保哥所說的方法嗎?
    但是我看不懂他所說的方法- -

     

    請看一下這篇:http://www.purecs.net/thread/topic290_1.aspx

     

    你可以將更換 MasterPage 的程式寫在 Page_PreInit 事件裡,當你將 Page_PreInit 事件寫在 BasePage 裡的話,每一頁都繼承這個 BasePage 後,就不需要每一頁加上這個事件了,所以你只要改一次全部都改了,也可以寫一些判斷條件在這裡,動態的來切換不同的 MasterPage。

     

    不知道這樣子說你瞭解嗎?


    ----
    From: Will
    Blog: http://blog.miniasp.com/
    記載著 Will 在網路世界的學習心得與技術分享

    2007年12月5日 下午 12:39
  • 意思是說 我要再建一個BasePage.vb

    然後把Page_PreInit的指令下在裡面
    其他的在繼承他嗎?

    2007年12月5日 下午 06:22
  • 我是將 MatserPage 的資訊存在 Seeson ,但是實作上可以存在 Profile 或是自己定義的資料表...

    依照每個帳號所選的 MasterPage 來改變,Theme 作法亦然。

     

    玩玩看吧...

     

    App_Code\BasePage.cs

    程式碼區塊

    using System;
    using System.Web.UI;

     

    public class BasePage : Page
    {
        protected override void OnPreInit(EventArgs e)
        {

            // 將 MasterPage 的名稱記在 Session
            if (Session["Master"] != null)
            {
                MasterPageFile = Session["Master"].ToString();
            }
            else
            {
                MasterPageFile = "~/MasterPage.master";
            }
        }
    }

     

    MasterPage: MasterPage.masterMasterPage2.master :

    內容略....

     

    Defalut2.aspx

    程式碼區塊




    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>



     



    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>




    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
        <asp:Button ID="Button1" runat="server" Text="Button"
        onclick="Button1_Click" />
        <asp:Button ID="Button2" runat="server" Text="Button"
        onclick="Button2_Click" />
    </asp:Content>



     

     

     

    Default2.aspx.cs

    程式碼區塊

    using System;
    using System.IO;

     

    public partial class Default2 : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

     

        // 切換 MasterPage

        protected void Button1_Click(object sender, EventArgs e)
        {
            Session["Master"] = "~/MasterPage2.master";
            Response.Redirect(Path.GetFileName(Request.CurrentExecutionFilePath));
        }

     

        // 換頁

        protected void Button2_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default3.aspx");
        }
    }

     

     

    Default3.aspx

    程式碼區塊


    <%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3"  %>

     

    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    </asp:Content>


     

     

     

    Default3.aspx.cs

    程式碼區塊

    using System;

     

    public partial class Default3 : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }

     

    2007年12月6日 上午 05:52
  • 謝謝上面每一位前輩們的解說

    讓我不僅能解決問題 更能充實一些功能應用

     

    2007年12月6日 下午 05:09