2010-12-04 42 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处的值。添加不直接添加到视图状态。它已添加到已处于视图状态的集合中。结果是,当集合被序列化时,添加到名称的值将被序列化。这是一个理解参考类型(它是一个字典)的问题