C# 存储字典<;字符串,字符串>;是否处于ASP.NET视图状态?
我正在尝试在为ASP.NET 2.0开发的自定义控件的ViewState中存储一个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); }
字典
:
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
后,会从myRenderControl
覆盖调用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。如果为空,则可能是页面生命周期有问题。如果不是空的,那么问题就会缩小。