2010-07-20 108 views
0

在msdn上我们有这个http://msdn.microsoft.com/en-us/library/ms972976.aspx。 一般一个网站的生命看起来是这样的: Initialization-> LoadViewState-> LoadPostBackData->负荷 - > RaisePostBackEvent-> SaveViewState->渲染ASP.NET文本框在回发后保留其文本属性

我有一个占位符,在我的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; 
} 

当我把sommething放入这些文本框并单击该按钮时,该页面被回发,但我的文本框保存了输入值,尽管我在页面Load事件中更改了它们的文本属性。这些控件是在LoadViewState和LoadPostBackData之后触发的Load事件上动态创建的,所以它是如何工作的?什么时候控制收到他们的postdata?

+0

您正在动态创建对象 - 这意味着它们是内存中的新对象。以这种方式想想,在每一次页面加载时,您都在重新创建文本框 - 因此尽管tb1是一个在回发时将值设置为“foo”的对象,但您正在创建一个名为tb2的新对象 - 它不会保留视图状态。 – RPM1984 2010-07-20 12:03:58

+0

@ RPM1984这与viewstate – 2010-07-20 12:10:31

+0

无关。但我的问题是,这些文本框保存在页面上输入的文本属性。我看到页面上的文本框,并输入“我的文本blablabla”,然后我单击按钮,我的文本框仍然显示“我的文本blablabla”,所以当新的文本框再次创建负载事件收到此属性?这只发生在动态创建的控件上......并且textbox在状态视图中没有保留它的值,但是在回发数据中,可以关闭此控件的视图状态,并且在回发后仍然保持它的值 – shin 2010-07-20 12:15:05

回答

1

事件顺序的前提是稍微错误的。见本页:http://msdn.microsoft.com/en-us/library/aa479328.aspx。您会发现ProcessPostData实际上会出现两次,一次出现在PageLoad之前,并且一次处理动态创建的第一次出现的控件。

此外,这与ViewState有关,这是一种常见的误解。它不是。尝试在文本框上设置EnableViewState = false,看看它是否有所作为。

+0

是的我了解ViewState并感谢问题得到解答;) – shin 2010-07-20 13:17:43

相关问题