Tom*_*ing 5 c# asp.net viewstate
我正在尝试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;
}
}
Run Code Online (Sandbox Code Playgroud)
访问它看起来像这样:
public void UpdateData
{
if (this.Items == null)
this.Items = new Dictionary<string, string>();
else
this.Items.Clear();
//Fill the collection
}
Run Code Online (Sandbox Code Playgroud)
当第一次加载页面时设置它,它似乎工作正常.但是在随后的回发中,返回的值始终为null(第一个条件总是发生).调试显示它已null退出属性中的ViewState get.
我做了一些研究,发现类必须实现IStateManager为可以在ViewState中保存,而字典MSDN页面似乎表明Dictionary<TKey, TValue>没有.但我之前在ViewState中存储了字典没有问题.这里发生了什么?我以前的经历是侥幸吗?
更新:我尝试在属性中添加一些测试代码:ViewState["ItemTest"] = "foo";在set和string test = (string)ViewState["ItemTest"];中get.就像Dictionary它一样,它出来了.所以它似乎不是可Dictionary序列化的问题.此外,澄清UpdateData一下RenderControl,从我的覆盖中调用,它发生在Page_Load包含控件的页面之后.
您可以将字典存储在ViewState中,但是您在页面生命周期中尝试执行此操作的时间太晚.就像之后加载InitViewState 一样,ViewState 在呈现控件之前保存.RenderControl在生命周期的早期将逻辑移出并移入另一个方法或事件处理程序,例如PreRender.
protected override void OnPreRender(EventArgs e)
{
if (this.Items == null)
{
this.Items = new Dictionary<string, string>();
}
base.OnPreRender(e);
}
Run Code Online (Sandbox Code Playgroud)
只要未在控件或其父控件上禁用ViewState,您就会注意到该对象在后续回发中不再为null.