【问题标题】:ASP.NET textboxes hold their text property after post backASP.NET 文本框在回发后保留其文本属性
【发布时间】:2010-07-20 21:13:55
【问题描述】:

在 msdn 上,我们有这个 http://msdn.microsoft.com/en-us/library/ms972976.aspx。 一般来说,一个网站的生命周期是这样的: 初始化->LoadViewState->LoadPostBackData->Load->RaisePostBackEvent->SaveViewState->Render

我的 aspx 端有一个占位符,如下所示:

<asp:PlaceHolder ID="ph1" runat="server">
  <asp:Button OnClick="ClickMe" ID="Button1" runat="server" Text="Button" />
</asp:PlaceHolder>

我正在页面加载事件上创建两个文本框,代码如下所示:

for (int i = 0; i <2; i++)
{
    TextBox tb = new TextBox(); 
    tb.ID = "tb" + i.ToString();
    tb.Text = "my test string";
    ph1.Controls.Add(tb);
}

点击按钮事件如下所示:

protected void ClickMe(object sender, EventArgs e)
{
      var mycontrols = ph1.Controls;
}

当我将一些东西放入这些文本框并单击按钮时,页面被回发,但我的文本框保留了输入的值,尽管我正在页面加载事件上更改它们的文本属性。这些控件是在 LoadViewState 和 LoadPostBackData 之后触发的 Load 事件上动态创建的,那么它是如何工作的?控件什么时候收到他们的 postdata??

【问题讨论】:

  • 您正在动态创建对象 - 这意味着它们是内存中的新对象。这样想,在每次页面加载时,您都在重新创建文本框 - 所以虽然 tb1 是一个在回发时将值设置为“foo”的对象,但您正在创建一个名为 tb2 的新对象 - 它不会保留视图状态。
  • @RPM1984 这与视图状态无关
  • @matt-dot-net。也许我当时误解了这个问题(从 OP 的最新评论看来,我是这样)。这跟那有什么关系?
  • @shin 我怀疑 TextBox 本身正在调用 LoadPostData() 本身来加载数据而不是页面。从 OO 的角度来看,这似乎是正确的。可能会尝试创建一个继承自默认控件的新 TextBox 控件并覆盖 LoadPostData() 以查看是否是这种情况?请参阅链接以供参考。 msdn.microsoft.com/en-us/library/…
  • @shin,我猜这篇文章(以及上面的一些链接)有你想要的答案。 bytes.com/topic/asp-net/answers/…

标签: c# asp.net textbox views postback


【解决方案1】:

您对事件顺序的假设略有错误。请参阅此页面:http://msdn.microsoft.com/en-us/library/aa479328.aspx。您会发现 ProcessPostData 实际上发生了两次,一次在 PageLoad 之前,一次在处理第一次没有出现的动态创建的控件之后。

另外,一个常见的误解是这与 ViewState 有关。它不是。尝试在您的文本框上设置 EnableViewState=false,看看它是否会有所不同。

【讨论】:

  • 是的,我知道 ViewState,感谢问题得到解答;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多