我有一个自定义UserControl我正在使用哪些主机动态创建控件,我遇到了一个奇怪的情况,我似乎失去了ViewState信息。在我对base.SaveViewState()调用的重写的SaveViewState方法中,我希望它返回一个包含ViewState中所有内容的对象,但它返回null。
protected override object SaveViewState()
{
object[] tempState = new object[2];
tempState[0] = base.SaveViewState(); //***suspected issue here, tempState[0] == null -- why?
//? this.ViewState["CompanyID"] returns me the guid I'm expecting
//... code instantiating and populating lstDataControlInfos
tempState[1] = lstDataControlInfos;
return tempState;
}
我在该方法中放置了一个断点,我可以使用立即窗口查询ViewState [“CompanyID”]并验证ViewState中确实存在一个CompanyID。也许我误解了一些关于ViewState的东西,但该调用是否应该返回已经存在于ViewState中的内容(包括我的CompanyID)?在重写的LoadViewState方法中,问题在回发上成为问题,因为我不再有任何方法将CompanyID从ViewState中取出;它回来了。
protected override void LoadViewState(object savedState)
{
object[] tempState = (object[])savedState;
//tempState[0] == null, as it was stored in the previous SaveViewState call
//any reference to ViewState["CompanyID"] comes back null
base.LoadViewState(tempState[0]);
}
我提到我有动态控件,我正在从这个控件中的ViewState序列化和反序列化,而这些似乎都正常工作。什么会导致base.SaveViewState()在我知道事实时返回null并且可以在SaveViewState调用期间验证(通过即时窗口)ViewState中是否有数据?
答案 0 :(得分:3)
将值保存到ViewState时,如果正在跟踪ViewState,则该值将标记为脏。
跟踪从TrackViewState开始,在Initialize之后和Load之前。
跟踪以SaveViewState结束,这是在PreRender之后。
如果在ViewState中设置值时未跟踪ViewState,则在调用SaveViewState时不会保留ViewState。这是一件好事:它意味着您可以在Init阶段使用ViewState而不会使序列化的ViewState膨胀。
当您向树动态添加控件时,您应该注意:
之前设置的值将控件添加到控件树中将不保持不变,即使您在跟踪ViewState时添加控件也是如此。
将控件添加到控件树 后,如果您处于跟踪ViewState的阶段,将保留。
>在页面生命周期的哪个阶段,您设置了ViewState [“CompanyID”],是否在将控件添加到控件树之前或之后这样做?