C# 为什么可以’;是否在Page.PreInit事件后动态应用主题和母版页?
C# 为什么可以’;是否在Page.PreInit事件后动态应用主题和母版页?,c#,asp.net,webforms,master-pages,themes,C#,Asp.net,Webforms,Master Pages,Themes,1) 由于以下原因,我假设只能在Page.PreInit事件处理程序中以编程方式设置主题: 如果我们在Page.Init事件处理程序中设置了一个主题,那么此时ViewState已经被跟踪,因此主题应用的任何数据都将被跟踪并标记为脏数据(这将消耗大量带宽) 若我们在Init事件之后设置它,那个么主题也可以覆盖应用于单个控件的反序列化ViewState数据 在Page.PreInit之后不能设置主题还有其他原因吗 2) 另外,为什么不能在Page.PreInit之后应用母版页 thanx根据
1) 由于以下原因,我假设只能在Page.PreInit事件处理程序中以编程方式设置主题:
- 如果我们在Page.Init事件处理程序中设置了一个主题,那么此时ViewState已经被跟踪,因此主题应用的任何数据都将被跟踪并标记为脏数据(这将消耗大量带宽)
- 若我们在Init事件之后设置它,那个么主题也可以覆盖应用于单个控件的反序列化ViewState数据
在Page.PreInit之后不能设置主题还有其他原因吗
2) 另外,为什么不能在Page.PreInit之后应用母版页 thanx根据这一点: “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";
}
还有什么其他原因可以解释这个主题吗
无法在Page.PreInit之后设置
对。主题包括皮肤,皮肤可以指定控件的属性。这些属性需要在Init事件期间设置,因此在此之前需要选择所需的主题
ViewState跟踪可能是一个问题,但我认为与上述问题相比,这是一个次要问题
请注意,StyleSheetTheme(优于常规主题,IMO)实际上是从页面上的重写属性设置的,而不是通过设置属性本身的值(除非从HttpModule设置)
为什么不能应用母版页
在Page.PreInit之后
控件根据其在控件树中的位置(包括访问表单控件等)确定其ID和各种其他特性和属性。母版页相当于一组父控件,因此控件可以完全初始化自己,直到父结构就位。初始化发生在初始化事件期间,因此在此之前需要选择母版页。我关于在初始化前不能设置主题的假设是否正确?我不确定主题,但对于母版页,控件层次结构将是决定性的。RickNZ-“StyleSheetTheme实际上是从页面上的重写属性设置的。”我认为这是因为我们最早可以通过编程方式设置StyleSheetThemes的是Page.PreInit内部,这已经太晚了,因为StyleSheetThemes内部定义的皮肤需要在PreInit事件之前应用于控件?!