C# 存储字典<;字符串,字符串>;是否处于ASP.NET视图状态?

C# 存储字典<;字符串,字符串>;是否处于ASP.NET视图状态?,c#,asp.net,viewstate,C#,Asp.net,Viewstate,我正在尝试在为ASP.NET 2.0开发的自定义控件的ViewState中存储一个字典: private Dictionary<String, String> Items { get { object d = ViewState["Items"]; return (d == null ? null : (Dictionary<String, String>)d); }

我正在尝试在为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;
        }
    }
专用字典项
{
得到
{
对象d=视图状态[“项目”];
返回(d==null?null:(字典)d);
}
设置
{
ViewState[“Items”]=值;
}
}
访问它的方式如下所示:

public void UpdateData
{
    if (this.Items == null)
        this.Items = new Dictionary<string, string>();
    else
        this.Items.Clear();
    //Fill the collection
}
public void UpdateData
{
if(this.Items==null)
this.Items=newdictionary();
其他的
this.Items.Clear();
//填满藏品
}
当第一次加载页面时设置它时,它似乎工作正常。但是在随后的回发中,返回的值总是null(第一个条件总是发生)。调试表明,它正在从属性
get
的ViewState中获取
null

我做了一些研究,发现类必须实现
IStateManager
才能在ViewState中保存,并且似乎表明
Dictionary
没有。但是我以前在ViewState中存储过字典,没有问题。这是怎么回事?我以前的经历是偶然的吗


更新:我尝试向属性添加一些测试代码:
ViewState[“ItemTest”]=“foo”集合中的code>和
字符串测试=(字符串)视图状态[“ItemTest”]get
中选择code>。与
词典
一样,它也是空的。因此,
字典
可序列化似乎没有问题。另外,为了澄清,在包含控件的页面中加载
Page\u
后,会从my
RenderControl
覆盖调用
UpdateData

确保在页面生命周期中访问属性的时间不要太早,因为viewstate没有直接加载


您第一次从什么方法(页面生命周期中的哪个点)请求此属性?

您可以将字典存储在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);
}
protected override void OnPreRender(事件参数e)
{
if(this.Items==null)
{
this.Items=newdictionary();
}
基于预渲染(e);
}

您会注意到,只要控件或其父控件上的ViewState未被禁用,该对象在后续回发中就不再为null。

您在哪里检查这些值?我相信ViewState是在
Init
事件之后加载的。比如在返回之前检查null?第一次加载页面时,不会有值。控件在页面中是静态还是动态添加的?您可以使用
值作为类型
运算符,如果强制转换失败,它将给出null。@Jefferson先生-强制转换null值返回null,除非您强制转换为值类型,否则不会引发异常。例如
(string)null==null
。它是从
RenderControl
覆盖调用的,我相信它在
页面加载之后,所以它应该在那里。也许你应该尝试用同样的方式存储一个字符串,看看在回发后该字符串是否也是null。如果为空,则可能是页面生命周期有问题。如果不是空的,那么问题就会缩小。