1)我假设主题只能在Page.PreInit事件处理程序中以编程方式设置,原因如下:
如果我们在Page.Init事件处理程序中设置一个主题,那么到那时候ViewState已经被跟踪,因此主题应用的任何数据都会被跟踪并标记为脏(这将消耗大量带宽) )?
如果我们在Init事件之后设置它,那么主题还可以覆盖应用于各个控件的反序列化ViewState数据?
还有其他原因导致无法在Page.PreInit后设置主题吗?
2)另外,为什么不能在Page.PreInit?
之后应用母版页感谢名单
答案 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事件期间,因此需要在此之前选择母版页。