Минимизируя размер ViewState в ASP.Net, есть ли разница между инициализацией управляющих значений в конструкторе и OnInit? - PullRequest
1 голос
/ 12 апреля 2011

Хорошо, я пытаюсь понять, как лучше всего обрабатывать ViewState, для программной установки значений по умолчанию с использованием C #. Я понимаю, что построение скрытого поля ViewState основано на каждом значении, которое устанавливается после запуска события OnInit. Я не совсем понимаю, есть ли разница между использованием конструктора элемента управления или событием OnInit для установки значений по умолчанию.

public MyControl(){
    this.Text = "SomeDefaultValue";
}

против

protected override void OnInit(EventArgs e){
    this.Text = "SomeDefaultValue";
}

Я видел несколько мест, где предлагается проверить значение ViewState для null в get данного свойства, например:

public string Text {
    get {
        return this.ViewState["Text"] == null ?
            "SomeDefaultValue" :
            this.ViewState["Text"] as string;
    }
    set { this.ViewState["Text"] = value; }
}

Мне это не нравится, потому что сбивает значение с толку.

Итак, есть ли функциональная разница между использованием конструктора против OnInit для установки значений по умолчанию ViewState?

Ответы [ 2 ]

4 голосов
/ 12 апреля 2011

С точки зрения минимизации ViewState нет никакой разницы, поскольку ViewState начинает отслеживание после запуска метода OnInit.

Там имеют некоторые функциональные различия, однако: до элемента управленияинициализирован, вы не можете получить доступ к другим свойствам, таким как Page.По этой причине я обычно предпочитаю использовать либо OnInit, либо какой-либо обработчик, связанный с событием Init.

Кроме того, будьте осторожны с переопределением OnInit: вы должны вызвать base.OnInit(), чтобы убедиться, что другое событиеобработчики для события Init по-прежнему вызывают.

Я настоятельно рекомендую вам прочитать эту прекрасную статью по теме: http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx

Редактировать

Чтобы уточнить, ViewState запускаетсяотслеживание для данного элемента управления после запуска метода OnInit для этого элемента управления .Так что в данном примере вы можете переопределить OnInit следующим образом:

protected override void OnInit(EventArgs e){
    this.Text = "SomeDefaultValue"; // Make sure this happens before base.OnInit
    base.OnInit();
}

Это работает, потому что свойство Text сохраняет значение в ViewState этого контроля .Однако, допустим, у вас есть еще один дочерний элемент управления (в качестве примера я буду использовать Label).Метка OnInit уже будет запущена к тому времени, когда будет вызван метод OnInit вашего элемента управления.Поэтому, если вы хотите изменить значение Текст метки, вам нужно будет сделать это во время фазы OnInit этой метки (или раньше).

Вы можете сделать это в конструкторе текущего элемента управления:

public MyControl(){
    this.Label.Text = "SomeDefaultValue";
}

... но, как упоминалось ранее, у вас не будет доступа к внешней структуре управления, которая может потребоватьсяв некоторых случаях.Хорошей альтернативой в этих случаях является использование обработчика событий Init на самой метке.Вы можете подключить сам обработчик событий в своем конструкторе:

public MyControl(){
    this.Label.Init += 
        (sender, e) => this.Label.Text = 
             ((TextBox)Page.FindControl("SomeControl")).Text;
}

... но это будет работать только в том случае, если элемент управления объявлен непосредственно как член вашего класса.Если метка находится внутри шаблона (как в повторителе), вам нужно использовать разметку, чтобы подключить ее:

<asp:Label runat="server" OnInit="Label_Init" />

с кодом:

public void Label_Init(object sender, EventArgs e)
{
    var label = (Label)sender;
    label.Text = ((TextBox)Page.FindControl("SomeControl")).Text;
}

Этот последний пример имеет преимущество работы практически со всеми обстоятельствами, которые я могу придумать, но он требует большего количества стандартного кода, а также изменения в разметке.Так что выбирайте яд в зависимости от вашей конкретной ситуации.

0 голосов
/ 12 апреля 2011

Существует довольно подробный документ о ViewState в MSDN :

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

Я бы сказал, что если вы используете ViewState, используйте OnInit.

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