ViewState不保留回发值/页面生命周期的哪个阶段是要使用的视图状态

时间:2013-02-25 10:24:11

标签: asp.net viewstate page-lifecycle

如果标题看起来很荒谬,我会提前道歉。我试图在我陷入困境的情况下理解两者的答案。我在按钮点击时动态创建用户控件,同时跟踪viewstate中的计数。以下是代码:

private int custControlCountID;

    public int CustControlCountID
    {
        get 
        {
            return (int)(ViewState["CustControlCountID"] == null? 1 : ViewState["CustControlCountID"]); 
        }
        set 
        {
            ViewState["CustControlCountID"] = value; 
        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        for (int i = 0; i < CustControlCountID; i++)
        {
            RejRow customControl = (RejRow )LoadControl("~/RejRow .ascx");
            customControl.ID = "rejRow" + i;
            divHolder.Controls.Add(customControl);
        }
    }

    protected void btnNewRow_Click(object sender, EventArgs e)
    {
        CustControlCountID = CustControlCountID + 1;
        RejRow customControl = (RejRow)LoadControl("~/RejRow.ascx");
        customControl.ID = "rejectRow" + CustControlCountID;
        divHolder.Controls.Add(customControl);
    }

我只分享了相关代码。单击按钮控件成功添加但仅一次。这是因为在Page_Init上,CustControlCountID始终设置为1。 我已经知道在Page_Init之后调用LoadViewState,因此我设置的值在Page_Init中不可用。我还了解到在构建控件层次结构期间要在Page_Init中添加的控件。请帮我理解这一点。

1 个答案:

答案 0 :(得分:1)

理论表明,当Page_init和Page_load之间加载ViewState时,在Page_init期间获得的值不是来自加载的视图状态,如果设置它,它可能会在框架时被覆盖实际上在页面生命周期的下一步中加载它。

您可以尝试通过覆盖CreateChildControls方法来加载控件。