我有一个相当复杂的页面,它在转发器内动态构建用户控件。在初始化 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/