我有一个相当复杂的页面,它在转发器内动态构建用户控件。该转发器必须在 Init page 事件期间绑定ViewState
已初始化,否则动态创建的用户控件将不会保留其状态。
这创建了一个有趣的 Catch-22,因为我将转发器绑定到的对象需要在初始页面加载时创建,然后保留在内存中,直到用户选择离开或保存。
因为我无法使用ViewState
为了存储这个对象,但让它在 Init 期间可用,我被迫将它存储在 Session 中。
这也有问题,因为我必须在非回发期间显式地清空会话值,以便模拟如何ViewState
works.
在这种情况下必须有更好的状态管理方法。有任何想法吗?
Edit:关于使用的一些好的建议LoadViewState
,但当我这样做时,我仍然遇到状态未恢复的问题。
这是页面结构的一些内容
页面 --> 用户控件 --> 转发器 --> 动态创建 N 个用户控件。
我把覆盖的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 需要创建我们上面使用的 savingState 数组:
protected override object SaveViewState() {
var stateToSave = new List<object> { repeaterData, base.SaveViewState() };
return stateToSave.ToArray();
}
不要忘记使用如下代码在 Init 或 Load 中绑定中继器:
if( !IsPostBack ) {
// Bind your repeater here.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)