方案1:
我创建一个TextBoxButton,将它们添加到页面中,并在TextBoxPageOnInit事件中全部设置OnLoad的值。

当我执行回发/表单发帖时,通过Button单击,我(从浏览器)输入到TextBox中的任何内容都会保留到下一次回发/页面加载中。

方案2:
我创建一个TextBoxButton并将它们添加到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/

10-17 01:55