2010-12-04 74 views
3

我從一個網站得到了一個示例代碼。有一件事我只是不明白如何在ViewState自動添加價值。關於C#屬性的困惑

在頁面加載事件據我所知,一些值已在詞典收集和整個集合在一個名爲「名稱」的ViewState後加入添加了如下

private Dictionary<Guid, string> Names 
{ 
    get { return (Dictionary<Guid, string>)ViewState["Names"]; } 
    set { ViewState["Names"] = value; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     // to keep this sample really simple, we will populate some 
     // sample data in a Dictionary and store in the viewstate 
     var names = new Dictionary<Guid, string> 
     { 
      { Guid.NewGuid(), "John" }, 
      { Guid.NewGuid(), "Smith" }, 
      { Guid.NewGuid(), "Arther" }, 
      { Guid.NewGuid(), "Hari" } 
     }; 
     //store the list in the viewstate. 
     ViewState.Add("Names", names); 

     //init grid   
    } 
} 

protected void btnAddSave_Click(object sender, EventArgs e) 
{ 
    if (Page.IsValid) 
    { 
     Names.Add(Guid.NewGuid(), txtNewName.Text);    
    } 
} 

的代碼。

in btnAddSave_Click事件代碼Names.Add(Guid.NewGuid(), txtNewName.Text);在集合中再次添加名稱。

但有一件事我只是不明白,如何在視圖狀態中添加新的值。

如果有人看private Dictionary<Guid, string> Names屬性沒有任何setter,所以在ViewState中如何自動添加新值。我希望我的問題很明確。簡單地說,我只想知道那裏沒有任何setter,但是當代碼像Names.Add(Guid.NewGuid(), txtNewName.Text);一樣時,在ViewState中新增了多少值。

自動如何在ViewState中添加新值。因爲在字典集合中添加了新的值,但是在向字典集合中添加任何值之後,在ViewState中添加的所有字典值都沒有可用的代碼。我運行代碼並且它工作正常。因此,此代碼對我來說變得非常模糊。所以請幫助我瞭解在字典集合中添加任何新值時ViewState中如何添加新值。謝謝!

回答

2

內部實現的ViewState的是解釋這就是爲什麼有可能

當您訪問

Names.Add(Guid.NewGuid(), txtNewName.Text);    

參與

1以下步驟獲得的由名字是在代表財產後備存儲你的情況是ViewState [「姓名」]。

看到屬性名稱的吸氣部分

private Dictionary<Guid, string> Names 
{ 
**get { 
     return (Dictionary<Guid, string>)ViewState["Names"]; 
    }** 
set { ViewState["Names"] = value; }} 

編輯,對於托馬斯的意見,我將我的迴應

忘了二傳手,其唯一的吸氣劑,現在當你提領名稱只讀屬性,實際類型背後的dereferencing是statebag和statebag實現IDictionary,這就是爲什麼你可以將ViewState屬性轉換爲Dictionary,現在當你調用Dictionary的Add方法時,它將存儲在已知的StateBag中s控件的ViewState。 所以ViewState的是隻是一個控件的屬性,它是不是一個類型是什麼在ViewState中添加

+0

它是如何工作的。你可以請擴展更多的示例代碼。謝謝 – Thomas 2010-12-04 10:01:43

+0

我給代碼犯了一個錯誤。代碼是私人的Dictionary Names {get {return(Dictionary )ViewState [「Names」]; }}實際上沒有setter,所以當Names.Add(Guid.NewGuid(),txtNewName.Text);這個代碼執行,然後如何在viewstate中添加新的值,因爲這裏我添加了新的值到dictionary.so如何添加字典viewstate因爲property.plzz中沒有設置setter的擴展 – Thomas 2010-12-04 18:33:36

+0

忘記了setter,它的唯一getter,現在當您解除引用名稱只讀屬性時,dereferencing後面的實際類型是ViewState,它是一個statebag,statebag實現了IDictionary,這就是爲什麼你可以將ViewState轉換爲Dictionary,現在當你調用Dictionary的Add方法時,它將被存儲在已知的Control的ViewState的StateBag中。 – TalentTuner 2010-12-05 03:32:27

0

不是字典的內容,但對參考字典。此後,您仍然可以更改字典中包含的內容。

當頁面的執行完成並且即將發送到瀏覽器時,字典的內容將被序列化。在此之前,您可以更改字典,並且更改將在ViewState中結束。

0

Names處的值。添加不直接添加到視圖狀態。它已添加到已處於視圖狀態的集合中。結果是,當集合被序列化時,添加到名稱的值將被序列化。這是一個理解參考類型(它是一個字典)的問題