2010-07-20 112 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

相關問題