2011-06-09 38 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

相关问题