asp.net - 当你无法使用ViewState时你会做什么?

标签 asp.net webforms viewstate page-lifecycle

我有一个相当复杂的页面,它在转发器内动态构建用户控件。在初始化 ViewState 之前,必须在初始化页面事件期间绑定(bind)此转发器,否则动态创建的用户控件将不会保留其状态。

这创建了一个有趣的 Catch-22,因为我将转发器绑定(bind)到的对象需要在初始页面加载时创建,然后保留在内存中,直到用户选择离开或保存。

因为我无法使用 ViewState 来存储该对象,但又在 Init 期间使其可用,所以我被迫将其存储在 Session 中。

这也有问题,因为我必须在非回发期间显式地清空 session 值,以便模拟 ViewState 的工作方式。

在这种情况下必须有更好的状态管理方法。有什么想法吗?

编辑:关于使用LoadViewState的一些好的建议,但我仍然遇到这样做时状态未恢复的问题。

这是页面结构

Page --> UserControl --> Repeater --> 动态创建 N 个 UserControl。

我将重写的LoadViewState放在父UserControl中,因为它被设计为完全封装并独立于它所在的页面。我想知道这是否是问题所在。

最佳答案

页面上的LoadViewState方法绝对是答案。总体思路如下:

protected override void LoadViewState( object savedState ) {
  var savedStateArray = (object[])savedState;

  // Get repeaterData from view state before the normal view state restoration occurs.
  repeaterData = savedStateArray[ 0 ];

  // Bind your repeater control to repeaterData here.

  // Instruct ASP.NET to perform the normal restoration of view state.
  // This will restore state to your dynamically created controls.
  base.LoadViewState( savedStateArray[ 1 ] );
}

SaveViewState需要创建我们上面使用的savedState数组:

protected override object SaveViewState() {
  var stateToSave = new List<object> { repeaterData, base.SaveViewState() };
  return stateToSave.ToArray();
}

不要忘记使用如下代码在 Init 或 Load 中绑定(bind)转发器:

if( !IsPostBack ) {
  // Bind your repeater here.
}

关于asp.net - 当你无法使用ViewState时你会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45176/

相关文章:

c# - 如何使用SqlDataSource选择级联DropDownList

c# - TextBox 中的 ASP.net 简写

asp.net - 如何禁用 .aspx 页面的 ViewState?

asp.net - 除了 View 状态之外还有其他方式存储数据源吗?

html - 如何在 HTML textarea 元素中强制使用单行?

android - 来自 Fragments 的 `onViewStateRestored` 如何工作?

javascript - ASP : Switching between two ScriptManagers. 或者如何删除脚本引用

java - 跨不同技术保持 session

asp.net - 使用数据库优先将 ASP.NET SQL 成员身份迁移到 ASP.NET 标识

c# - ASP.NET 中按字母、数字和字符的高级排序实现