ASP.Net生命周期和控制状态和视图状态

时间:2014-02-26 07:10:39

标签: c# asp.net page-lifecycle

在msdn中,他们提到,在page_init和page_initcomplete之间加载了视图状态值。让我们假设,在get请求期间,我将文本框的text属性赋值为page_load () { if(!IsPostBack) {textobx.text="get";}}中的get。因此,此获取值存储在viewstate中并在浏览器中可见。在我的下一个回发期间,我正在为page_init事件中的同一文本属性分配一个帖子值。因此,根据msdn,在page_initcomplete事件之后,此post值必须由get值覆盖。但事情并非如此。为什么?

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            TextBox1.Text = "hello";
        }
        TextBox2.Text = TextBox1.Text.ToString();

    }
    protected override void OnPreInit(EventArgs e)
    {
            base.OnPreInit(e);
            TextBox1.Text = "init";
    }
    protected override void OnInitComplete(EventArgs e)
    {
            base.OnInitComplete(e);
            TextBox1.Text = "init";

    }

第一次在Textbox2.Text中将值设为hello,这很好。但在回发期间,我期待textbox2.text的初始值。但它仍然是你好。为什么?

3 个答案:

答案 0 :(得分:1)

您的ViewState假设不太正确。如ASP.NET Page Life Cycle Overview中所述,ViewState在InitComplete之后加载。

意思是,无论你在InitInitComplete中写入控件的属性(在生命周期的那一点都不推荐btw),最终会被{{1}之间的ViewState覆盖。 }和InitComplete

您的网页显示的行为是正确的。

答案 1 :(得分:0)

您可以访问this link了解有关生命周期的更多信息 “问题”是每次POSTback都会将数据发布到服务器。服务器将获取此发布数据并将其绑定到视图控件 此绑定操作发生在Init事件之后发生的Load事件中。

那么你的代码目前在回发期间所做的是:
调用init,创建控件和自定义代码将Text值设置为Init 调用load,将所有发布数据绑定到控件(包括“hello”)。由于它不是回发,因此text属性不会被重置为“Hello”(但由于发布数据而存在)。

答案 2 :(得分:0)

来自http://msdn.microsoft.com/en-us/library/ms178472%28v=vs.90%29.aspx

PreInit:-如果请求是回发,则控件的值尚未从视图状态恢复。如果在此阶段设置控件属性,则其值可能会在下一个事件中被覆盖。

Viewstate已加载到OnPreLoad