ASP.NET WebForms自定义UserControl - base.SaveViewState()返回null - 为什么?

Vit*_*toc 5 c# asp.net viewstate user-controls webforms

我有一个自定义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;
}
Run Code Online (Sandbox Code Playgroud)

我在该方法中放置了一个断点,我可以使用立即窗口查询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]);
}
Run Code Online (Sandbox Code Playgroud)

我提到我有动态控件我正在序列化并从此控件中的ViewState反序列化,这些似乎都正常工作.什么会导致base.SaveViewState()在我知道事实时返回null并且可以在SaveViewState调用期间验证(通过立即窗口)ViewState中是否有数据?

Joe*_*Joe 4

当您将值保存到 ViewState 时,如果正在跟踪 ViewState,则该值将被标记为脏。

跟踪从 TrackViewState 开始,位于初始化之后、加载之前。

跟踪在 SaveViewState 结束,它位于 PreRender 之后。

如果在 ViewState 中设置值时未跟踪 ViewState,则当您调用 SaveViewState 时该值不会被保留。这是一件好事:这意味着您可以在 Init 阶段使用 ViewState,而不会使序列化的 ViewState 膨胀。

当您向树中动态添加控件时,应注意:

  • 即使在跟踪 ViewState 时添加控件,在将控件添加到控件树之前设置的值也不会保留。

  • 如果您处于跟踪 ViewState 的阶段,则将控件添加到控件树设置的值将被保留。

您在页面生命周期的哪个点设置 ViewState["CompanyID"],是在将控件添加到控件树之前还是之后进行设置?