При создании пользовательских элементов управления я видел два шаблона для использования состояния просмотра. Одним из них является использование свойств для маскировки доступа к состоянию представления как постоянных данных.
public bool AllowStuff
{
get
{
return (ViewState[constKeyAllowStuff] != null) ?
(bool)ViewState[constKeyAllowStuff] : false;
}
set { ViewState[constKeyAllowStuff] = value; }
}
Другой - использовать закрытые поля-члены и переопределить методы Load / SaveViewState в элементе управления и обрабатывать их все явно:
protected override object SaveViewState()
{
object[] myViewState = new object[2];
myViewState[0] = base.SaveViewState();
myViewState[1] = _allowStuff;
return myViewState;
}
protected override void LoadViewState(object savedState)
{
object[] stateArray = (object[])savedState;
base.LoadViewState(stateArray[0]);
_allowStuff = (bool)stateArray[1];
}
(Я убрал много проверок на безопасность для ясности, так что просто проигнорируй это.)
Есть ли особые преимущества у одного метода над другим? Я не вижу, как они сильно отличаются по производительности. Версия 1 ленивая, поэтому, я думаю, вы сэкономите немного, если вам не нужно это конкретное значение во время прохода. Версия 1 также более абстрактна, детали лучше скрывают. Версия 2 более понятна, когда данные действительно действительны, и их можно читать или изменять (между загрузкой и сохранением), поскольку они более четко работают в жизненном цикле ASP.NET.
Версия 2, как правило, требует большего количества стандартного кода (свойство, вспомогательное приватное поле и обработка состояния представления в двух местах), в отличие от версии 1, которая объединяет все это в одном месте.
Мысли тогда?