2015-11-25 79 views
0

我想在回發期間使用ViewState保留我的文本框的輸入。這裏是代碼:隱藏ViewState ASPX代碼不保存

private Label store_Incident_Number = new Label(); 
private TextBox Incident_Number = new TextBox(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ViewState["Incident_Number"] != null) 
     {     
      store_Incident_Number.Text = "TEST" + (string)ViewState["Incident_Number"]; 
      Panel1.Controls.Add(store_Incident_Number); 
     } 
    } 

    void Page_PreRender(object sender, EventArgs e) 
    { 
     ViewState.Add("Incident_Number", Incident_Number.Text); 

    } 

上面的代碼位於我的default.aspx.cs(後面的代碼)。 Panel1是一個asp控件,它位於表單標籤之外的網頁上。我試圖按照這個例子:https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx

我希望Incident_Number文本框的文本保存到頁面回發後的標籤上,但它似乎並沒有工作,我不知道這個問題。請注意,文本框會動態添加到頁面的表單中,並在每次回發時重新創建。我的問題是我如何在頁面回發後保留文本框的值?

編輯:修正了!請看我接受的答案。此外,在Page_Init期間任何可能觸發另一個回發 的事件處理程序 或其他進程都將刷新您在viewstate中保存的值(即保存的文本不存在)。

+0

我覺得你的工作難度比你需要。如果您在ASP.NET WebForms環境中使用控件,只要正確處理頁面生命週期,許多(包括TextBox)都具有自動視圖狀態管理。將TextBox添加到Page_Init事件中的窗體中,然後在Page_Load事件發生前(假設它每次具有相同的ID),它的視圖狀態將自動恢復,以便用戶輸入的文本將被保留。 – user2638401

回答

1

正如我在我的評論中提到,你不是讓你在的WebForms系統正常工作。下面是一個使用動態創建的控件維護視圖狀態的例子。根據您的描述,該面板不在表單中。

當頁面顯示時,您可以輸入新文本並重復點擊提交。 TextBox值將自動保留。

Default.aspx的

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    </form> 
    <asp:Panel ID="Panel1" runat="server"></asp:Panel> 
</body> 
</html> 

Default.aspx.cs

using System; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    private Label store_Incident_Number = new Label(); 
    private TextBox Incident_Number = new TextBox() { ID = "TextBox1" }; 
    private Button SubmitButton = new Button() { ID = "Button1", Text = "Submit" }; 


    protected void Page_Init(object sender, EventArgs e) 
    { 
     // what is created during this event has viewstate restored to it 
     Panel1.Controls.Add(store_Incident_Number); 
     form1.Controls.Add(Incident_Number); 
     form1.Controls.Add(SubmitButton); 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // the viewstate has already been restored so you can access the content of the TextBox 
     store_Incident_Number.Text = Incident_Number.Text; 
    } 
} 
+0

我的問題是 - 動態控制必須存在於回發後的頁面,以便viewstate保存/加載它的值?如果這是正確的,我實際上有一個新的問題,但我寧願再次發佈,以避免文本牆。這是關於一個下拉列表(加載差異控制)和一個提交按鈕,都觸發回發。 – Alex

+0

我在這裏耗盡時間,明天早上我會在第一時間發佈它,謝謝user2638401 – Alex

+0

是的。Page_Init事件完成後,頁面上的任何控件(無論是ASPX文件中的靜態還是Page_Init中的動態添加)都會恢復(或者如果用戶使用最新的帖子更改了內容,則會更新)。因此,您在Page_Init期間構建頁面的_structure_,並在Page_Load期間處理控件的_content_。 – user2638401

2

這是因爲頁面加載方法的預渲染之前運行。你可以通過Google asp.net頁面lifecicle來查找更多細節。

什麼你基本上這裏做的是在ViewState中添加它之前加載標籤值。

而且,這將有助於如果你能告訴我們如何你到底是做回發。因爲例如點擊事件也是頁面生命週期的一部分,這可能會改變一些事情。

+0

謝謝。我以爲我知道頁面生命週期,顯然我不是。這應該怎麼做?此外,我會更新我的文章,包括如何回傳完成。 – Alex

+0

我也試圖遵循這個例子:https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx – Alex