С точки зрения минимизации 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;
}
Этот последний пример имеет преимущество работы практически со всеми обстоятельствами, которые я могу придумать, но он требует большего количества стандартного кода, а также изменения в разметке.Так что выбирайте яд в зависимости от вашей конкретной ситуации.