支持私有视图状态
更新:2007 年 11 月
除了应用程序视图状态外,您还可以维护 ASP.NET 移动控件的私有状态信息。当移动控件维护内部信息时,建议不要依赖应用程序设置来保持这类信息。相反,编写应用程序时让它使用私有视图状态。私有视图状态的示例包括页上的当前活动窗体、有关窗体的分页信息,以及控件适配器作出的特定于设备的决策。
私有视图状态在许多方面与应用程序视图状态不同。它用呈现的页写入,而不是保存在会话状态中。它也不能由应用程序禁用。而且由于所有私有状态都是动态生成的,用于应用程序视图状态的跟踪语义不适用于私有视图状态。
要使用私有视图状态,控件必须重写 LoadPrivateViewState 和 SavePrivateViewState 方法。这些方法的工作方式与 LoadViewState 和 SaveViewState 方法相同。编写控件时,不要让控件使用应用程序视图状态机制(例如 ViewState 状态属性)来保存属于私有视图状态的设置。
控件适配器也可以参与私有视图状态。控件适配器可以实现 LoadAdapterState 和 SaveAdapterState 方法。这些是分别从 LoadPrivateViewState 和 SavePrivateViewState 方法的 MobileControl 基类实现调用的。
由于私有视图状态写入到客户端,不受应用程序控制,因此移动控件必须尽可能高效地使用私有视图状态。下面的示例阐释了一种优化控件实现的方法。
protected override Object SavePrivateViewState()
{
Object baseState = base.SavePrivateViewState;
Object myState = GetMyState();
if (baseState == null && myState == null)
return null;
else if (myState == null)
return baseState;
else
return new Object[] { baseState, myState };
}
protected override void LoadPrivateViewState(Object state)
{
if (state is Object[])
{
Object[] arr = (Object [])state;
base.LoadPrivateViewState(arr[0]);
LoadMyState(arr[1]);
}
else if (state != null)
base.LoadPrivateViewState(state);
}
如果控件没有任何要保存的私有视图状态,则从 SavePrivateViewState 方法返回 null。另外请注意,您不需要使用私有视图状态来保存被设置为默认值的属性。