2009-12-25 77 views
2


爲什麼不能在Page.PreInit事件後動態應用主題和主頁面?

1)我認爲主題可以編程裏面只有Page.PreInit事件處理程序設置由於以下原因:

  • 如果我們想設置Page.Init事件處理程序內的主題,那麼到那時ViewState已經被跟蹤了,因此任何由Theme應用的數據都會被跟蹤並被標記爲髒(這會消耗大量的帶寬)?

  • 如果我們在Init事件之後設置它,那麼Themes還可以覆蓋應用於單個控件的反序列​​化的ViewState數據?


在什麼情況主題不能Page.PreInit後設置任何其他原因?


2)另外,爲什麼不能母版頁Page.PreInit後應用?

感謝名單

回答

3

根據此:

http://odetocode.com/articles/450.aspx

的 '的MasterPageFile' 屬性只能 中或 'Page_PreInit' 事件之前設置。

這一例外是有道理的,因爲我們 知道主頁有 之前重新排列 頁面的控制層次的Init事件觸發

物品還包括下面的例子:

using System; 
using System.Web.UI; 

public class BasePage : Page 
{ 
    public BasePage() 
    { 
     this.PreInit += new EventHandler(BasePage_PreInit); 
    } 

    void BasePage_PreInit(object sender, EventArgs e) 
    { 
     MasterPageFile = "~/Master1.master"; 
    } 
} 

或者,我之前用過的一種方法:

protected override void OnPreInit(EventArgs e) 
    { 
     base.OnPreInit(e); 
     if (Request.QueryString["Master"] == "Simple") 
      MasterPageFile = "~/Masterpages/Simple.Master"; 
    } 
+0

我的假設是爲什麼在PreInit正確後無法設置主題? – carewithl 2009-12-25 22:25:00

+1

我不確定主題,但對於母版頁,控制層次結構將是決定性的。 – davek 2009-12-25 22:35:22

+0

thanx幫助我出局 – carewithl 2009-12-28 19:20:15

1

是否有任何其他原因爲什麼主題 無法在Page.PreInit之後設置?

是的。主題包括皮膚,可以指定控件的屬性。這些屬性需要在Init事件中設置,因此需要在此之前選擇所需的主題。

ViewState跟蹤可能是一個問題,但我認爲這是一個小問題。請注意,StyleSheetTheme(最好是普通主題,IMO)實際上是從頁面上的重寫屬性設置的,而不是通過設置屬性本身的值(除非您從HttpModule中設置它)。

爲什麼不能在Page.PreInit之後應用母版頁 ?

控件根據它們在控件樹中的位置(包括訪問表單控件等內容)來確定它們的ID和各種其他特性和屬性。主頁面的作用相當於一組父控件,因此控件可以完全初始化自己,直到該父控件結構就位。初始化發生在Init事件期間,因此在此之前需要選擇主頁面。

+0

RickNZ - 「StyleSheetTheme實際上是從頁面上被重寫的屬性設置的。」我認爲這是由於我們最早可以以編程方式設置StyleSheetThemes在Page.PreInit中,這已經太遲了,因爲在StyleSheetThemes中定義的皮膚需要在PreInit事件之前應用於控件?! – carewithl 2009-12-28 19:19:35

相關問題