MSDN建议在页面生命周期的PreInit事件中创建动态控件。
http://msdn.microsoft.com/en-us/library/ms178472.aspx
为什么呢?
在PreInit事件中创建有什么优势?
我看过一些代码,开发人员是在Page_Load方法中创建动态控件的?
这两者有什么区别吗?
谢谢!
MSDN建议在页面生命周期的PreInit事件中创建动态控件。
http://msdn.microsoft.com/en-us/library/ms178472.aspx
为什么呢?
在PreInit事件中创建有什么优势?
我看过一些代码,开发人员是在Page_Load方法中创建动态控件的?
这两者有什么区别吗?
谢谢!
Page_Load
工作得很好,但是如果您需要将其持久化,则不应该在Load
阶段添加这些控件,因为动态控件必须存在于页面控件层次结构中才能加载ViewState。在Load ViewState之前只有一个阶段-初始化。这意味着,如果您希望动态控件保留视图状态,则必须在页面的Init
事件中将它们添加到控件层次结构中。Init
事件中访问ViewState
,因为它尚未加载。因此,如果需要,在Postback中存储变量时,需要使用不同的持久性介质(例如Session)。参考链接:https://web.archive.org/web/20210302172017/https://aspnet.4guysfromrolla.com/demos/printPage.aspx?path=/articles/092904-1.aspx。Load
事件中使用它们的ViewState。我错过了什么? - ceztko这个回复可能对原帖的作者来说有点晚了,但我认为它可能会帮助其他人。
如果你的应用程序/网站不使用主页面,最好在Page_PreInit事件中创建控件。但如果你使用主页面并想在内容页面上运行时创建控件,则Page_Init是理想的事件。
你也可以在Page_Load上创建控件,但请记住,页面加载后View State已经被加载。
Tim,感谢您的回复。
我进行了一个小实验,在Page_Load方法中动态创建并添加TextBox控件。
在页面上Button的Postback click事件中,我尝试获取TextBox的Text属性的值。当控件是在Page_Load事件而不是OnPreInit方法中动态添加时,我能够在Button的click事件中获取该值。
我认为即使控件是在Page_Load方法中添加的,ViewState仍会保留Text属性的值。
以下是代码:
<div>
<p>
<asp:Label ID="lbl" runat="server" />
</p>
<p>
<asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder>
</p>
<p>
<asp:Button ID="btn" runat="server" Text="Click" OnClick="btn_Click" />
</p>
</div>
private void _createTextBox()
{
TextBox textBox = new TextBox();
textBox.ID = "txtBox";
textBox.Width = 250;
textBox.ReadOnly = false;
plcHolder.Controls.Add(textBox);
}
protected void Page_Load(object sender, EventArgs e)
{
_createTextBox();
if (!this.IsPostBack)
{
Control ctrl = plcHolder.FindControl("txtBox");
if (ctrl != null)
{
TextBox txtBox = ctrl as TextBox;
txtBox.Text = DateTime.Now.ToString();
}
}
}
protected void btn_Click(object sender, EventArgs e)
{
Control ctrl = plcHolder.FindControl("txtBox");
if (ctrl != null)
{
TextBox txtBox = ctrl as TextBox;
lbl.Text = txtBox.Text;
}
}
请问这个是否正确或者我做错了什么?
OnLoad
可能会起作用,但并不总是如此,在OnInit
中更为稳妥。 - Tim Schmelter