什么时候可以重写与ViewState相关联的特性并使其使用ControlState ?

本文关键字:ControlState 重写 ViewState 关联 什么时候 | 更新日期: 2023-09-27 18:12:08

ControlState vs ViewState

我正在使用一个RadListBox。RadListBox有以下属性,默认设置为True:

此属性的功能依赖于ViewState。也就是说,当客户端进行更改时,更改存储到控件的ViewState模型中,然后在下一次回发期间解析ViewState,更改"重新运行"并应用于控件服务器端。

不幸的是,我没有在我的页面上启用ViewState,而且我也没有真正尝试启用它。也就是说,我想要这个功能。所以,我在考虑我的其他选择。

MSDN文档声明"仅对跨回发的控制所必需的少量关键数据使用控制状态。"不要使用控件状态作为视图状态的替代。"

我在想:

  • 什么算少量的关键数据?bool吗?一个小项目清单?少于10000个数据点??
  • 我应该注意哪些陷阱?这对我来说是一条愚蠢的道路吗?等

关于正确使用ControlState的任何其他信息都会很好。谢谢。

什么时候可以重写与ViewState相关联的特性并使其使用ControlState ?

首先,我必须承认我从来没有使用过ControlState在回发之间持久化值。但是,创建其他开发人员使用的控件的控件开发人员可能希望使用它来确保功能,即使ViewState被禁用。否则,禁用将导致不正确的行为或不明显的错误。

所以在我看来,如果你通常使用ViewState,你会使用ControlState,但你必须确保当ViewState被禁用时,控制也能工作。在这种情况下,句子"不要使用控件状态作为视图状态的替代"将是错误的,因为您也应该使用ViewState,仅用于少量必须在回发中持久化的数据。

一个例子来说明我的意思:

假设您想创建一个继承GridView的自定义控件。您可以将数据存储在ViewState中,以便跨回发维护值。您应该允许在控件上禁用ViewState而没有任何问题,您不应该依赖于它已启用的事实,因为正在使用您的控件的开发人员可能希望减少网络流量。但你可以提供其他属性,存储在ControlStateSortDirectionPageIndexDeleteButtonText等,你认为是重要的,是单一的值,因此更少的资源密集比存储所有GridViewRows

编辑:根据你的实际问题:

你可以为一些控件启用ViewState,为其他控件禁用ViewState,但你不能为整个页面禁用ViewState,并为本页中的子控件启用ViewState。

如果你把turn page的ViewState设置为off,那么你就没有办法为特定组件启用ViewState。这是因为ViewState是递归序列化,所以当页面不允许ViewState时,它不会序列化任何子控件的ViewState。如果你不想显式地关闭单个的ViewState控件,但希望保持一些控件的ViewState意识,这是最好的方法会写一个小的实用程序方法来关闭ViewState吗所有控件(使用递归或其他方式)。然后为启用ViewState您希望为其启用ViewState的控件。或者,一种中间立场和不那么强硬的方式是可能的控件是其他容器控件(如Panel)中的组。你可以禁用面板内所有控件的ViewState面板的ViewState .

为少数控件启用ViewState,为其他控件禁用/page

编辑:这是一个扩展,以启用/禁用ViewState所有子控件(VB.NET)

<System.Runtime.CompilerServices.Extension()> _
Public Sub EnableChildViewState(ByVal parentControl As System.Web.UI.Control, enable as Boolean) 
    If parentControl.HasControls Then
        For Each c As System.Web.UI.Control In parentControl.Controls
            c.EnableViewState = enable 
            EnableChildViewState(c, enable)
        Next
    End If
End Sub

你可以叫它:

Page.EnableChildViewState(False)
MyControl.EnableViewState = True

我相信您可以在逐个控件的基础上启用viewstate。所以你可以在页面上关闭它,但在这个特定的控件上启用它。

另外,因为你不是控件的创建者,我认为你不能让它停止使用viewstate而使用controlstate。除非你有代码或者可以子类化它