2013-06-03 54 views
0

我已經看到了一些代碼ViewState的變量工作時像回發和ViewState的

protected void Page_Load(object sender, EventArgs e) 
    { 
     //find if this is the initial get request 
     //after you click a button, this code will not run again 
     if (!IsPostBack) 
     { 
      if(ViewState["clicks"] ==null) 
      { 
       ViewState["clicks"] = 0; 
      } 
      //we're using the ViewState[clicks] to initialize the text in the text box 
      TextBox1.Text = ViewState["clicks"].ToString(); 
     } 
    } 

有人能指出其中我們絕對需要檢查 if(ViewState["clicks"] == null)或程序將無法運行的情況下,似乎習慣?我嘗試添加另一個按鈕,先點擊新按鈕,然後點擊Button1,程序仍然運行良好,即使在Button 2點擊它是回發之後,程序仍然在多次點擊按鈕1後運行相同。

+0

在你使用的情況下,它可能不是完全必要的;然而,你將如何處理ViewState的本地類型?如果沒有價值,你需要某種特殊處理。通過本機類型我的意思是整數,日期時間和Guid值... – CSharpConductor

回答

1

由於ViewState是一個Dictionary對象(StateBag)如果您試圖從不存在的視圖狀態中獲取值,則不會引發異常。要確定你想要的價值是在視圖狀態下,你會做你所問的。

另外,如果您正在開發將在ViewState禁用的頁面上使用的控件或共享組件,ViewState對於ViewState值將爲null。 http://msdn.microsoft.com/en-us/library/ms228048%28v=vs.85%29.aspx

+0

我主要是好奇我怎麼可以添加另一個按鈕的形式,先點擊它,所以我知道該頁面是一個回傳,但代碼仍然運行良好。很高興知道爲什麼我可以訪問我從未明確聲明的變量! :) – wootscootinboogie

0

有人能指出其中我們絕對需要檢查 的情況下,如果(的ViewState [「點擊」] == NULL)或程序將無法運行:這

位分別取自?

肯定的:

protected void Page_Load(object sender, EventArgs e) 
    { 
     //find if this is the initial get request 
     //after you click a button, this code will not run again 
     if (!IsPostBack) 
     { 
      //if (ViewState["clicks"] == null) 
      //{ 
      // ViewState["clicks"] = 0; 
      //} 
      //we're using the ViewState[clicks] to initialize the text in the text box 
      TextBox1.Text = ViewState["clicks"].ToString(); 
     } 
    } 

這將打破,因爲你試圖呼籲你需要非空的東西的方法,但在第一個頁面加載,這將是空的。如果你問我們爲什麼首先對它進行空測試,那麼在分配它之前,你應該知道if-null測試對於賦值沒有好處,它是爲了設置文本框文本的行的好處。在代碼中出現IF塊時,我們可以保證當我們使用ViewState [「clicks」]。ToString()時,我們不會嘗試在null上調用ToString()(因爲ViewState [「點擊」]或者已在其他地方設置或者它已被這個IF博克默認)

按鈕後2單擊它是一個回傳,該程序仍 運作相同後,我點擊按鈕1多次

但是..當它是一個回傳時,這個完整的代碼塊將不會運行..如果它的回傳,ViewState將永遠不會用在PageLoad中

+0

我的評論是該程序仍然運行得很好。上面的答案解釋了原因。 – wootscootinboogie