2011-06-09 83 views
5

我試圖存儲在自定義控制的ViewState的一個Dictionary<string, string>我開發ASP.NET 2.0:在ASP.NET視圖狀態下存儲Dictionary <string,string>?

private Dictionary<String, String> Items 
    { 
     get 
     { 
      object d = ViewState["Items"]; 
      return (d == null ? null : (Dictionary<String, String>)d); 
     } 
     set 
     { 
      ViewState["Items"] = value; 
     } 
    } 

訪問它看起來像這樣:

public void UpdateData 
{ 
    if (this.Items == null) 
     this.Items = new Dictionary<string, string>(); 
    else 
     this.Items.Clear(); 
    //Fill the collection 
} 

當它到達設置第一次加載頁面,它似乎工作正常。但在後續回發中,返回的值始終爲空(始終發生第一種情況)。調試顯示它在屬性get中的ViewState之外獲得null

我做了一些研究,並有found的類必須實現IStateManager是saveable在ViewState中,和Dictionary MSDN page似乎表明Dictionary<TKey, TValue>沒有。但是我之前在ViewState中存儲了字典而沒有任何問題。這裏發生了什麼?我以前的經歷是僥倖嗎?

更新:我試着在屬性中添加一些測試代碼:ViewState["ItemTest"] = "foo";setstring test = (string)ViewState["ItemTest"];get。像Dictionary一樣,它是空的。所以它似乎不是可序列化的Dictionary的問題。另外,爲了澄清,UpdateData從我的RenderControl重寫中調用,這發生在包含該控件的頁面中的Page_Load之後。

+2

你在哪裏檢查值?我相信ViewState在'Init'事件之後被加載。 – keyboardP 2011-06-09 17:51:33

+0

在返回之前檢查null嗎?第一次加載頁面時,那裏不會有價值。 – 2011-06-09 17:52:39

+0

您的控件是否在頁面中添加了靜態或動態? – ibram 2011-06-09 17:54:31

回答

8

您可以將字典存儲在ViewState中,但您正嘗試在頁面生命週期中這樣做太遲。就像ViewState在Init之後加載,在控件呈現之前,ViewState被保存。將您的邏輯從RenderControl中移出,並移入生命週期早期的另一個方法或事件處理程序,如PreRender

protected override void OnPreRender(EventArgs e) 
{ 
    if (this.Items == null) 
    { 
     this.Items = new Dictionary<string, string>(); 
    } 

    base.OnPreRender(e); 
} 

你會發現這個對象不再是空在隨後的回傳,只要不被上的控制或其父禁用ViewState中。

+0

好的,再次檢查。你的正確。 – 2013-01-15 11:07:26

1

確保您沒有在頁面生命週期中過早訪問屬性,因爲視圖狀態未直接加載。

您是第一次請求該屬性的方法(頁面生命週期中的哪個點)?

+0

它是從'RenderControl'覆蓋中調用的,我相信它是在Page_Load之後的,所以它應該在那裏。 – 2011-06-09 17:58:24

+0

也許你應該試着簡單地以同樣的方式存儲一個字符串,看看回發後這個字符串是否也是null。如果它爲空,那麼您可能在頁面生命週期中遇到問題。如果不是空的,將縮小問題範圍。 – thekip 2011-06-09 18:31:34

相關問題