我从网站上获得了一个示例代码。关于如何在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);
}
}
在页面加载事件中我知道在Dictionary集合中添加了很少的值,之后整个集合被添加到名为“Names”的ViewState中。
在btnAddSave_Click
事件中,代码Names.Add(Guid.NewGuid(), txtNewName.Text);
在集合中再次添加名称。
但有一件事我只是不明白如何在viewstate中添加新值。
如果某人看起来private Dictionary<Guid, string> Names
属性,则没有任何setter,因此在ViewState中如何自动添加新值。我希望我的问题很明确。简单来说,我只是想知道没有任何setter,但是当代码变成Names.Add(Guid.NewGuid(), txtNewName.Text);
时,ViewState中是如何添加新值的。
自动在ViewState中添加新值的方式。因为在字典集合中添加了新值,但是没有代码可用,其中在向字典集合添加任何值之后在ViewState中添加了所有字典值。运行代码并且它工作正常。因此,此代码对我来说变得非常模糊。所以请帮助我理解在字典集合中添加任何新值时如何在ViewState中添加新值。谢谢!
答案 0 :(得分:2)
ViewState的内部实现是字典,这就是可能的原因
访问时
Names.Add(Guid.NewGuid(), txtNewName.Text);
以下步骤
1-获取名称所代表的属性的后备存储,在您的情况下是ViewState [“Names”]。
查看属性Names的getter部分
private Dictionary<Guid, string> Names
{
**get {
return (Dictionary<Guid, string>)ViewState["Names"];
}**
set { ViewState["Names"] = value; }}
编辑,对于Thomas评论,我正在添加我的回复
忘记了setter,它唯一的getter,现在当你取消引用Names readonly属性时,dereferencing背后的实际类型是statebag和statebag实现IDictionary,这就是为什么你可以将ViewState属性转换为Dictionary,现在当你调用Add的Dictionary方法时,它将存储在StateBag中,这是已知的Control的ViewState。 所以ViewState只是一个Control的属性,它不是一个类型
答案 1 :(得分:0)
ViewState中添加的内容不是字典的内容,而是对字典的引用。在此之后,您仍然可以更改字典中包含的内容。
当页面执行完成,并且即将发送到浏览器时,字典的内容将被序列化。在此之前,您可以更改字典,更改将以ViewState结束。
答案 2 :(得分:0)
Names.Add的值不会(直接)添加到视图状态。它已添加到已在viewstate中的集合中。结果是,当序列化集合时,将序列化添加到Names的值。这是理解引用类型(字典是)的问题