在页面生命周期的PreInit事件中创建动态控件?

4

MSDN建议在页面生命周期的PreInit事件中创建动态控件。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

为什么呢?

在PreInit事件中创建有什么优势?

我看过一些代码,开发人员是在Page_Load方法中创建动态控件的?

这两者有什么区别吗?

谢谢!


OnLoad 可能会起作用,但并不总是如此,在 OnInit 中更为稳妥。 - Tim Schmelter
3个回答

4
如果您不需要担心如何在Postback中保存控件的ViewState,那么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

我不明白你所说的“如果你想让动态控件保留视图状态,你必须在页面的Init事件中将它们添加到控件层次结构中”的意思。我遇到了一个问题,需要访问子动态控件的ViewState,以便在跨回发时保留值,并且在设置它们的父级后,我可以在页面的Load事件中使用它们的ViewState。我错过了什么? - ceztko
关于我所说的示例,请点击此处 - ceztko

2

这个回复可能对原帖的作者来说有点晚了,但我认为它可能会帮助其他人。

如果你的应用程序/网站不使用主页面,最好在Page_PreInit事件中创建控件。但如果你使用主页面并想在内容页面上运行时创建控件,则Page_Init是理想的事件。

你也可以在Page_Load上创建控件,但请记住,页面加载后View State已经被加载。


0

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;
    }
}

请问这个是否正确或者我做错了什么?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接