【发布时间】: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