Сначала я должен признать, что никогда не использовал ControlState
для сохранения значений в постбэках.Но разработчики элементов управления, которые создают элементы управления, которые используются другими разработчиками, могут захотеть использовать его для обеспечения функциональности, даже если ViewState
отключено.В противном случае отключение приведет к некорректному поведению или ошибкам, которые не очевидны.
Так что, по моему мнению, вы бы использовали ControlState
, если вы обычно используете ViewState
, но вы должны убедиться, что элемент управления также работает, когда ViewState
выключен.В этом случае предложение «Не использовать состояние управления в качестве альтернативы состоянию просмотра» было бы неправильным, поскольку вы должны использовать ViewState также только для небольших количеств данных, которые должны бытьсохраняется в постбэках.
Пример, поясняющий, что я имею в виду:
Предположим, вы хотите создать пользовательский элемент управления, который наследует GridView
.Вы можете хранить данные в ViewState
, чтобы поддерживать значения в обратных передачах.Вы должны разрешить отключение ViewState
на вашем элементе управления без каких-либо проблем, не следует полагаться на тот факт, что он включен, поскольку разработчики, использующие этот элемент управления, могут захотеть уменьшить сетевой трафик.Но вы могли бы предоставить другие свойства, которые хранятся в ControlState
, например SortDirection , PageIndex , DeleteButtonText и т. Д., Которые вы считаете важными и которые являются отдельными значениями для этого.менее ресурсоемкий, чем хранение всех GridViewRows
.
Edit : в зависимости от вашей реальной проблемы:
Вы можете включить ViewState для некоторых элементов управления и отключить его для других, ноВы не можете отключить его для всей страницы и включить его для дочерних элементов управления на этой странице.
Если вы отключите ViewState страницы поворота, то вы не сможете включить 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