何时可以覆盖与ViewState关联的功能并使其使用ControlState?

时间:2011-10-24 16:46:59

标签: c# asp.net viewstate web-controls

ControlState vs ViewState

我正在使用RadListBox。 RadListBox具有以下属性,默认情况下设置为True:PersistClientChanges

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

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

MSDN文档声明“仅对少量关键数据使用控制状态,这些数据对于回发控制至关重要。不要使用控制状态作为查看状态的替代方法。”

我想知道:

  • 什么算作少量关键数据?一个布尔?一小部分物品?少于10000个数据点??
  • 我应该注意哪些问题?这对我来说是一条愚蠢的道路吗?等。

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

2 个答案:

答案 0 :(得分:2)

首先,我必须承认,我从未使用ControlState在回发中保留值。 但是,创建其他开发人员使用的控件的控件开发人员可能希望使用它来确保即使ViewState被禁用也能保证功能。否则,禁用会导致不正常行为或不明显的错误。

因此,我认为如果您通常使用ControlState,则会使用ViewState,但必须确保在禁用ViewState时该控件也可以使用。 在这种情况下,句子“不要使用控制状态作为查看状态的替代”是错误的,因为您应该仅对少量数据使用ViewState必须坚持回发。

澄清我的意思的一个例子:

考虑您要创建一个继承GridView的自定义控件。您可以将数据存储在ViewState中,以维护回发之间的值。您应该允许在没有任何问题的情况下禁用控件上的ViewState,您不应该依赖它已启用的事实,因为使用您的控件的开发人员可能希望减少网络流量。但您可以提供存储在ControlState中的其他属性,例如 SortDirection PageIndex DeleteButtonText 等您认为很重要的属性是单个值,因此比存储所有GridViewRows的资源更少。

修改:根据您的实际问题:

您可以为某些控件启用ViewState并为其他控件启用它,但是您无法为整个页面禁用它,并在此页面中为子控件启用它。

  

如果您关闭翻页的ViewState,则无法使用   为特定组件启用ViewState。这是因为ViewState是   串行递归,所以如果Page不允许ViewState,   它不会为任何子控件序列化ViewState。如果   您不希望在个人身上明确关闭ViewState   控件,但希望保持一些控件ViewState意识,最好的方法   将写一个小的实用程序方法,关闭ViewState   所有控件(使用递归或其他方式)。然后启用ViewState   您要为其启用ViewState的控件。   或者,如果可能的话,可以采用中间地板和不太有力的方式   控件是其他容器控件(例如Panel)中的组。   您可以通过禁用为Panel内的所有控件禁用ViewState   小组的ViewState。

Enable ViewState for few controls and disable for others/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

答案 1 :(得分:0)

我相信您可以逐个控制地启用viewstate。因此,您可以为页面关闭它,但为此特定控件启用它。

此外,由于您不是控件的创建者,我认为您不能停止使用viewstate并使用controlstate。除非您有代码或可以将其子类化。