Когда допустимо переопределить функцию, связанную с ViewState, и заставить ее использовать ControlState? - PullRequest
2 голосов
/ 24 октября 2011

ControlState против ViewState

Я работаю с RadListBox. RadListBox имеет следующее свойство, которое по умолчанию установлено в True: PersistClientChanges

Функциональность этого свойства зависит от ViewState. То есть, когда изменение выполняется на стороне клиента, изменения сохраняются в модели ViewState для элемента управления, а затем при следующей обратной передаче ViewState анализируется, изменения «запускаются» и применяются к стороне элемента управления .

К сожалению, у меня не включен ViewState на моей странице, и я тоже не пытаюсь его включить. При этом я хочу эту функциональность. Итак, я смотрю на другие мои варианты.

Документация MSDN гласит «Использовать состояние элемента управления только для небольших объемов критических данных, которые важны для элемента управления с обратной передачей. Не используйте состояние элемента управления в качестве альтернативы состоянию просмотра». *

И мне интересно:

  • Что считается небольшим количеством важных данных? А бул? Небольшой список предметов? Менее 10000 точек данных ??
  • О каких гочах я должен знать? Для меня это тупой путь? Etc ..

Просто любая другая информация по правильному использованию ControlState была бы полезна. Спасибо.

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Сначала я должен признать, что никогда не использовал 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
0 голосов
/ 24 октября 2011

Полагаю, вы можете включить viewstate для каждого элемента управления.Таким образом, вы можете оставить его выключенным для страницы, но включить его для этого конкретного элемента управления.

Кроме того, поскольку вы не являетесь создателем элемента управления, я не думаю, что вы можете заставить его перестать использовать viewstate и использоватьcontrolstate.Если у вас нет кода или вы не можете подкласс его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...