【发布时间】:2011-06-09 17:47:51
【问题描述】:
我正在尝试将Dictionary<string, string> 存储在我正在为 ASP.NET 2.0 开发的自定义控件的 ViewState 中:
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
}
当它在页面第一次加载时被设置,它看起来工作正常。但在随后的回发中,返回的值始终为 null(第一个条件总是发生)。调试显示它正在从属性get 中的ViewState 中获取null。
我已经做了一些研究,并且 found 认为类必须实现 IStateManager 才能在 ViewState 中保存,而 Dictionary MSDN page 似乎表明 Dictionary<TKey, TValue> 没有。但是我之前在 ViewState 中存储了字典,没有问题。这里发生了什么?我以前的经历是侥幸吗?
更新:我尝试在属性中添加一些测试代码:set 中的ViewState["ItemTest"] = "foo"; 和get 中的string test = (string)ViewState["ItemTest"];。像Dictionary 一样,它是空的。因此,Dictionary 可序列化似乎不是问题。此外,为了澄清,UpdateData 是从我的 RenderControl 覆盖调用的,它发生在包含控件的页面中的 Page_Load 之后。
【问题讨论】:
-
你在哪里检查值?我相信 ViewState 在
Init事件之后被加载。 -
在返回之前检查 null 吗?页面第一次加载时,那里不会有值。
-
您的控件是在页面中添加的静态还是动态?
-
您可以使用
Value as Type运算符,如果转换失败,它将返回null。 -
@Mr. Jefferson - 转换空值返回 null,除非您转换为值类型,否则它不会引发异常。例如
(string)null == null.