在ASP.NET视图状态下存储Dictionary <string,string>?

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";setstring test = (string)ViewState["ItemTest"];get.就像Dictionary它一样,它出来了.所以它似乎不是可Dictionary序列化的问题.此外,澄清UpdateData一下RenderControl,从我的覆盖中调用,它发生在Page_Load包含控件的页面之后.

Ant*_*ram 8

您可以将字典存储在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.