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

标签 c# asp.net user-controls webforms viewstate

我有一个自定义 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 方法中成为回发问题,因为我不再有任何方法从 ViewState 中获取 CompanyID;它返回 null。

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,这些似乎都正常工作。当我知道一个事实并且可以验证(通过即时窗口)在 SaveViewState 调用期间 ViewState 中有数据时,什么会导致 base.SaveViewState() 返回 null?

最佳答案

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

跟踪从 TrackViewState 开始,它在 Initialize 之后和 Load 之前。

跟踪在 PreRender 之后的 SaveViewState 结束。

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

动态添加控件到树中时,需要注意:

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

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

在页面生命周期的什么时候设置 ViewState["CompanyID"],是在将控件添加到控件树之前还是之后?

关于c# - ASP.NET WebForms 自定义 UserControl - base.SaveViewState() 返回 null - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13038627/

相关文章:

c# - 如何在 Eclipse 中导入 .net 库?

c# - 通过 ForMember 从自定义 map 中提取 AutoMapper 源名称

c# - Crystal Reports中如何获取列的总和?

c# - DateTime ToString (“dd/MM/yyyy” ) 返回 dd.MM.yyyy

c# - 使用 StringBuilder(ASP.NET、C#)时添加新行

c# - 如何将 UserControl.ascx 的代码隐藏类放入另一个库中

c# - 如何以编程方式将 ASCX 内的 ASP.NET 控件添加到外部 RequiredFieldValidator?

c# - .NET 二进制文件缺少 AWS Lambda

c# - 为什么这个标签的文字不是完全透明的?

c# - 如何在 UWP 中创建通用 xaml 用户控件?