方案1:
我创建一个TextBox
,Button
,将它们添加到页面中,并在TextBox
的Page
或OnInit
事件中全部设置OnLoad
的值。
当我执行回发/表单发帖时,通过Button
单击,我(从浏览器)输入到TextBox
中的任何内容都会保留到下一次回发/页面加载中。
方案2:
我创建一个TextBox
和Button
并将它们添加到OnInit
事件上的页面。
我在TextBox
事件上设置了OnLoad
值,
当我执行回发/ form发布时,通过Button
单击,我输入到TextBox
(从浏览器中)的任何内容都不会保留,而是显示我在OnLoad
事件期间分配的值。
谁能解释这里发生了什么?
猜想我会说,ViewState
跟踪仅在添加TextBox
的事件中开始,或者在下一个事件(OnLoad
)被分配后立即标记为“肮脏”,但是这些真的是猜测!
最佳答案
让我们首先解决一个常见的误解: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
属性设置为“ Hello”。加载发布的表单数据(第二次尝试)。什么都没有发生,因为第一次尝试加载
Text
属性成功。最终结果:用户输入的值将被覆盖。
关于c# - 在ViewState/IPostback上混淆了持久文本框值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12218449/