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



在msdn中,他们提到,视图状态值在page_init和page_initcomplete之间加载。让我们假设,在 get 请求期间,我正在为文本框的文本属性分配一个值,如 get 在 page_load () { if(!IsPostBack) {textobx.text="get";}} 中。因此,此 get 值存储在视图状态中,在浏览器中可见。在我的下一次回发期间,我将page_init事件中的同一文本属性分配一个帖子值。所以根据 msdn ,在page_initcomplete事件之后,这个帖子值必须被 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这很好.但是在回发期间,我期望在textbox2.text上获得初始化值。但它仍然是你好。为什么?

你的ViewState假设不太正确。如 ASP.NET 页面生命周期概述中所述,视图状态在InitComplete后加载。

这意味着,无论您在 InitInitComplete 中写入控件属性中的任何内容(顺便说一句,在生命周期的那个点不建议这样做)肯定会被 InitCompleteLoad 之间的视图状态覆盖。

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

您可以访问此链接以获取有关生命周期的更多信息。
"问题"在于,每次回发时,您都会将数据发布到服务器。服务器将获取此发布数据并将其绑定到视图控件。
此绑定操作发生在 Init 事件之后发生的 Load 事件中。

因此,您的代码当前在回发期间执行的操作是:
调用 init,创建控件,自定义代码将 Text 值设置为 Init。
调用加载,将所有发布数据绑定到控件(包括"hello")。
由于它不是回发,因此文本属性不会重置为"Hello"(但由于发布数据,它在那里)。

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

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

视图状态在 OnPreLoad 中加载

最新更新