支持私有视图状态

更新:2007 年 11 月

除了应用程序视图状态外,您还可以维护 ASP.NET 移动控件的私有状态信息。当移动控件维护内部信息时,建议不要依赖应用程序设置来保持这类信息。相反,编写应用程序时让它使用私有视图状态。私有视图状态的示例包括页上的当前活动窗体、有关窗体的分页信息,以及控件适配器作出的特定于设备的决策。

私有视图状态在许多方面与应用程序视图状态不同。它用呈现的页写入,而不是保存在会话状态中。它也不能由应用程序禁用。而且由于所有私有状态都是动态生成的,用于应用程序视图状态的跟踪语义不适用于私有视图状态。

要使用私有视图状态,控件必须重写 LoadPrivateViewStateSavePrivateViewState 方法。这些方法的工作方式与 LoadViewStateSaveViewState 方法相同。编写控件时,不要让控件使用应用程序视图状态机制(例如 ViewState 状态属性)来保存属于私有视图状态的设置。

控件适配器也可以参与私有视图状态。控件适配器可以实现 LoadAdapterStateSaveAdapterState 方法。这些是分别从 LoadPrivateViewStateSavePrivateViewState 方法的 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。另外请注意,您不需要使用私有视图状态来保存被设置为默认值的属性。

请参见

其他资源

支持视图状态