让我们首先澄清一个常见的误解:a 的值TextBox
在回发中保持不变,因为浏览器在每个 POST 中将值作为表单数据的一部分发送,而不是因为值保存在视图状态中。视图状态与您看到的行为无关!
以下是与此问题相关的页面生命周期阶段:
- 引发
Init
事件。
- 加载已发布的表单数据(第一次尝试)。
- 引发
Load
事件。
- 加载已发布的表单数据(第二次尝试)。
现在让我们遍历每个场景,看看当用户更改文本框的值并单击按钮时会发生什么。
场景 1a:在 OnInit 中添加控件并设置 Text 属性。
private TextBox textBox = new TextBox { ID = "textBox" };
private Button button = new Button { ID = "submitButton", Text = "Submit" };
protected override void OnInit(EventArgs e)
{
this.placeHolder.Controls.Add(this.textBox);
this.placeHolder.Controls.Add(this.button);
this.textBox.Text = "Hello";
}
- 引发
Init
事件。被TextBox
添加到页面并且其Text
属性设置为“Hello”。
- 加载已发布的表单数据(第一次尝试)。该
Text
属性设置为用户输入的值。
- 引发
Load
事件。什么都没发生。
- 加载已发布的表单数据(第二次尝试)。没有任何反应,因为第一次加载
Text
属性的尝试成功。
最终结果:用户输入的值被持久化。
场景 1b:在 OnLoad 中添加控件并设置 Text 属性。
protected override void OnLoad(EventArgs e)
{
this.placeHolder.Controls.Add(this.textBox);
this.placeHolder.Controls.Add(this.button);
this.textBox.Text = "Hello";
}
- 引发
Init
事件。什么都没发生。
- 加载已发布的表单数据(第一次尝试)。没有任何反应,因为
TextBox
尚未添加到页面中。
- 引发
Load
事件。被TextBox
添加到页面并且其Text
属性设置为“Hello”。
- 加载已发布的表单数据(第二次尝试)。该
Text
属性设置为用户输入的值。
最终结果:用户输入的值被持久化。
场景 2:在 OnInit 中添加控件。在 OnLoad 中设置 Text 属性。
protected override void OnInit(EventArgs e)
{
this.placeHolder.Controls.Add(this.textBox);
this.placeHolder.Controls.Add(this.button);
}
protected override void OnLoad(EventArgs e)
{
this.textBox.Text = "Hello";
}
- 引发
Init
事件。被TextBox
添加到页面。
- 加载已发布的表单数据(第一次尝试)。该
Text
属性设置为用户输入的值。
- 引发
Load
事件。该Text
属性设置为“你好”。
- 加载已发布的表单数据(第二次尝试)。没有任何反应,因为第一次加载
Text
属性的尝试成功。
最终结果:用户输入的值被覆盖。