2008-09-03 61 views
5

我試圖在按下按鈕時設置一個ViewState變量,但它僅在第二次點擊按鈕時才起作用。這裏是代碼隱藏:在回發上設置視圖狀態

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     lblInfo.InnerText = String.Format("Hello {0} at {1}!", YourName, DateTime.Now.ToLongTimeString()); 
    } 
} 

private string YourName 
{ 
    get { return (string)ViewState["YourName"]; } 
    set { ViewState["YourName"] = value; } 
} 


protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    YourName = txtName.Text; 

} 

有什麼我失蹤?下面是設計文件的形式部分,就像POC非常基本的:

<form id="form1" runat="server"> 
<div> 
Enter your name: <asp:TextBox runat="server" ID="txtName"></asp:TextBox> 
<asp:Button runat="server" ID="btnSubmit" Text="OK" onclick="btnSubmit_Click" /> 
<hr /> 
<label id="lblInfo" runat="server"></label> 
</div> 
</form> 

PS:樣品是非常簡單的,「使用txtName.Text而不是ViewState的」不正確的答案,我需要在ViewState中的信息。

回答

12

Page_LoadbtnSubmit_Click之前發生火災。

如果您想在回發事件觸發後使用Page_PreRender執行某些操作。

//this will work because YourName has now been set by the click event 
protected void Page_PreRender(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
     lblInfo.InnerText = String.Format("Hello {0} at {1}!", YourName, DateTime.Now.ToLongTimeString()); 
} 

的基本順序有云:

  • 頁面初始化火災(INIT不能訪問的ViewState)
  • ViewState是讀
  • 頁面加載火災
  • 任何事件觸發
  • 的PreRender火災
  • 頁面渲染