【问题标题】:Storing Dictionary<string, string> in ASP.NET view state?在 ASP.NET 视图状态下存储 Dictionary<string, string>?
【发布时间】:2011-06-09 17:47:51
【问题描述】:

我正在尝试将Dictionary&lt;string, string&gt; 存储在我正在为 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&lt;TKey, TValue&gt; 没有。但是我之前在 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.

标签: c# asp.net viewstate


【解决方案1】:

您可以将字典存储在 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 未被禁用,您就会注意到该对象在后续回发中不再为空。

【讨论】:

    【解决方案2】:

    请确保您没有在页面生命周期中过早访问该属性,因为未直接加载视图状态。

    您是从什么方法(在页面生命周期的哪个时间点)首次请求此属性?

    【讨论】:

    • 它是从RenderControl覆盖调用的,我相信它在Page_Load之后,所以它应该在那里。
    • 也许您应该尝试以相同的方式简单地存储一个字符串,看看回发后该字符串是否也为空。如果它为 null,则您的页面生命周期可能存在问题。如果它不是空的,那将缩小问题范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2012-03-01
    • 2010-10-29
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多