为什么无法在Page.PreInit事件后动态应用主题和母版页?

时间:2009-12-25 21:02:43

标签: c# asp.net webforms master-pages themes


1)我假设主题只能在Page.PreInit事件处理程序中以编程方式设置,原因如下:

  • 如果我们在Page.Init事件处理程序中设置一个主题,那么到那时候ViewState已经被跟踪,因此主题应用的任何数据都会被跟踪并标记为脏(这将消耗大量带宽) )?

  • 如果我们在Init事件之后设置它,那么主题还可以覆盖应用于各个控件的反序列​​化ViewState数据?


还有其他原因导致无法在Page.PreInit后设置主题吗?


2)另外,为什么不能在Page.PreInit?

之后应用母版页

感谢名单

2 个答案:

答案 0 :(得分: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"; 
    } 

答案 1 :(得分:1)

  

主题还有其他原因吗?   在Page.PreInit?

之后无法设置

是。主题包括外观,可以指定控件的属性。这些属性需要在Init事件期间设置,因此需要在此之前选择所需的主题。

ViewState跟踪可能是一个问题,但我认为与上述相比,它是次要的。

请注意,StyleSheetTheme(优于常规主题,IMO)实际上是根据页面上的重写属性设置的,而不是通过设置属性本身的值(除非您从HttpModule设置它)。

  

为什么无法应用母版页   在Page.PreInit?

之后

控件根据它们在控制树中的位置(包括访问表单控件等内容)确定其ID和各种其他特性和属性。主页面的作用相当于一组父控件,因此控件可以完全初始化自己,直到父结构到位。初始化发生在Init事件期间,因此需要在此之前选择母版页。