为什么我的 UserControl 的 ViewState 只保存了一部分?
Why is my UserControl's ViewState partially saved?
我有一个大量使用 this.ViewState["Key"] = SomeValue
的用户控件。其中大部分是从我的 Page_Init():
加载的
protected void Page_Init(object sender, EventArgs e)
{
if(!IsPostBack)
{
ViewState["Blahblah"] = LoadSomeValue();
}
}
其余的设置在不同的点。
但由于某种原因,它在后续回发中不可用。我覆盖了 SaveViewState() 来检查,只保存了三个!
protected override object SaveViewState()
{
List<object> viewStateObjectsBefore = ViewState.OfType<object>().ToList();
object ret = base.SaveViewState();
List<object> viewStateObjectsAfter = ViewState.OfType<object>().ToList();
GC.KeepAlive(viewStateObjectsBefore);
GC.KeepAlive(viewStateObjectsAfter);
GC.KeepAlive(ret);
return ret;
}
viewStateObjectsBefore
和viewStateObjectsAfter
都包含10对key/value,但ret
只包含三对!
添加: 将初始化移动到 Page_Load()
不是一个容易获得的选项,因为初始化必须在父 Page_Load()
执行之前完成。
在我的 Page_Init() 末尾添加对 SetDirty() 的调用解决了问题:
protected void Page_Init(object sender, EventArgs e)
{
if(!IsPostBack)
{
ViewState["Blahblah"] = LoadSomeValue();
//Looks like the ViewState is not yet "tracking" changes before Page_Load.
//The items have to be marked as "dirty" manually so they'll be included by SaveViewState().
ViewState.SetDirty(true);
}
}
我有一个大量使用 this.ViewState["Key"] = SomeValue
的用户控件。其中大部分是从我的 Page_Init():
protected void Page_Init(object sender, EventArgs e)
{
if(!IsPostBack)
{
ViewState["Blahblah"] = LoadSomeValue();
}
}
其余的设置在不同的点。
但由于某种原因,它在后续回发中不可用。我覆盖了 SaveViewState() 来检查,只保存了三个!
protected override object SaveViewState()
{
List<object> viewStateObjectsBefore = ViewState.OfType<object>().ToList();
object ret = base.SaveViewState();
List<object> viewStateObjectsAfter = ViewState.OfType<object>().ToList();
GC.KeepAlive(viewStateObjectsBefore);
GC.KeepAlive(viewStateObjectsAfter);
GC.KeepAlive(ret);
return ret;
}
viewStateObjectsBefore
和viewStateObjectsAfter
都包含10对key/value,但ret
只包含三对!
添加: 将初始化移动到 Page_Load()
不是一个容易获得的选项,因为初始化必须在父 Page_Load()
执行之前完成。
在我的 Page_Init() 末尾添加对 SetDirty() 的调用解决了问题:
protected void Page_Init(object sender, EventArgs e)
{
if(!IsPostBack)
{
ViewState["Blahblah"] = LoadSomeValue();
//Looks like the ViewState is not yet "tracking" changes before Page_Load.
//The items have to be marked as "dirty" manually so they'll be included by SaveViewState().
ViewState.SetDirty(true);
}
}