2011-04-26 73 views
2

我想了解緩存,頁面視圖狀態和會話。我在VS2010中創建了一個ASP.NET Web應用程序,並在頁面中添加了3個文本框和一個按鈕。我運行在調試模式下,輸入隨機文本到每個文本中,按下按鈕,似乎沒有任何東西被保存(所有文本都是「null」,就像你在代碼中看到的那樣)。我是否在錯誤的地方執行了這些操作?我需要添加一些東西到web.config?下面是我使用的代碼:使用ASP.NET緩存/ ViewState /會話

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      if (Cache["textbox1"] != null) 
       TextBox1.Text = (string)Cache["textbox1"]; 
      else 
       TextBox1.Text = "null"; 

      if (ViewState["textbox2"] != null) 
       TextBox2.Text = (string)ViewState["textbox2"]; 
      else 
       TextBox2.Text = "null"; 

      if (Session["textbox3"] != null) 
       TextBox3.Text = (string)Session["textbox3"]; 
      else 
       TextBox3.Text = "null"; 
     } 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     Cache["textbox1"] = "(Cache) " + TextBox1.Text; 
     ViewState["textbox2"] = "(VS) " + TextBox2.Text; 
     Session["textbox3"] = "(Session) " + TextBox3.Text; 
    } 

和頁面標題:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="State._Default" EnableSessionState="True" EnableViewState="True" %> 

謝謝,對不起菜鳥問題。我對此很陌生。

+0

你介意發佈Default.aspx代碼的其餘部分嗎? – 2011-04-26 16:19:38

回答

1

Page_Load發生在Button1_Click之前。所以在Page_Load上,你總是用statebags中的東西代替文本框文本("null",然後"(Cache)" + "null"等)。你在文本框中輸入的內容永遠不會存在,直到Button1_Click

改爲使用Page_PreRender。

+0

看來,我對頁面生命週期的認識是嚴重缺乏的。將代碼移到OnPreRender完成了我想要做的事情。謝謝洛基和穆罕默德! – 2011-04-26 16:40:05

1

現在,每次單擊按鈕時,Page_Load過程中的代碼都會在Button1_Click事件有機會保存它們之前覆蓋TextBox.Text值。

如果將if (IsPostBack)更改爲if (!IsPostBack),則只有在最初請求頁面時,這些值纔會嘗試從session/viewstate/cache加載。因此,您必須請求頁面,使用按鈕設置新值,然後重新請求(在地址欄中輸入鍵)以在Page_Load中運行代碼。

我建議你創建一個名爲「加載值」的新按鈕,它的Click事件將運行當前在Page_Load中找到的代碼。這樣,您不必將該代碼與請求是否是回發關聯起來。我認爲這會讓你的測試結果更容易理解。