PageLoad и OnPreRender вызывались для элементов управления, которые не должны отображаться
Я использую этот упрощенный блок кода:
<% if (MyCondition())
{ %>
<myUsedControl/>
<% }
else
{ %>
<myUnusedControl/>
<% } %>
в моем файле ascx. Я предполагал, что когда ASP.Net прочитает эту страницу, если MyCondition() вернет true, он полностью проигнорирует все, что было в предложении else. Это не так, события myUnusedControl PageLoad и OnPreRendered по-прежнему запускаются при загрузке страницы, даже если myUnusedControl правильно скрыт, когда браузер отображает страницу.
Почему это? Как я могу убедиться, что часть ascx или aspx полностью игнорируется при отображении страницы?
Спасибо за ваше время.
3 ответа
Вы всегда можете создать дублирующую страницу со вторым элементом управления и поместить ветвь условия if ранее в конвейер, чтобы контролировать, какая страница загружается.
В этом примере вы всегда можете вручную добавить элемент управления в коллекцию элементов управления в коде и выполнить его обход вместо того, чтобы зарегистрировать элемент управления в разметке страницы ascx/aspx.
Динамически загружайте свой элемент управления на основе ваших условий (LoadControl) в Page OnInit и используйте эту переменную элемента управления в нужных вам методах.
открытый класс MyClass { MyUserControl _controlVariable;
protected override void OnInit(EventArgs e)
{
if (MyCondition())
{
_controlVariable = Loadcontrol("control1.ascx");
}
else
{
_controlVariable = Loadcontrol("control2.ascx");
}
}
}
ASP.NET не могу сделать вывод, что MyCondition()
не зависит от выполнения подписанного события PreRender. Также существует вероятность того, что метод имеет побочные эффекты, которые не должны выполняться дважды, поэтому его следует вызывать только один раз и как можно позже. Существует также требование поддерживать все элементы управления в актуальном состоянии в цикле событий; как должны работать различные компоненты на вашей странице, если один еще не инициализирован, в то время как другие уже инициировали свои события обратной передачи?
В несколько надуманном примере:
Boolean _condition;
Boolean MyCondition() {
return _condition;
}
void MyContrivedPreRender(Object sender, EventArgs e) {
_condition = true;
}
<% if(MyCondition()) { %>
<asp:Literal runat="server" Text="Hello world?"
OnPreRender="MyContrivedPreRender" />
<% } %>