У меня есть страница C#/ASP.NET .aspx, которая объявляет два средств управления, что каждый представляет содержание одной вкладки. Я хочу аргумент строки запроса (например? tab=1) для определения, какие из двух средств управления активируются. Моя проблема, они оба проходят события инициализации и заполняют их дочерние элементы управления, тратя впустую ресурсы ЦП и замедляя время отклика. Действительно ли возможно деактивировать их так или иначе, таким образом, они не проходят инициализации?
Моя .aspx страница похожа на это:
<% if (TabId == 0)
{ %>
<my:usercontroltabone id="ctrl1" runat="server" />
<% }
else if (TabId == 1)
{ %>
<my:usercontroltabtwo id="ctrl2" runat="server" />
<% } %>
И та часть хорошо работает. Я принял, что <% будет означать, что управление не было бы на самом деле объявлено и так не инициализирует, но это не так...
Если встроенный / спагетти-серверный код не помогает, я могу придумать только одно альтернативное решение: не объявлять элементы управления в разметке . Вместо этого загрузите нужный элемент управления на страницу из обработчика событий Page_Init
. Для этого можно использовать метод Page.LoadControl ()
:
void Page_Init(object sender, System.EventArgs e)
{
Control tab;
switch (TabId)
{
case 0: tab = LoadControl("usercontroltabone.ascx"); break;
case 1: tab = LoadControl("usercontroltabtwo.ascx"); break;
default: tab = LoadControl("defaulttab.ascx"); break;
}
somePlaceholder.Controls.Add(tab);
}
Примените свою логику в codebehind.
Объявите элемент управления:
<my:usercontroltabtwo id="ctrl2" Visible="False" runat="server" />
А затем установите Visibility:
if(TabId == 0)
{
ctrl1.Visible = true;
}
else if(TabId == 1)
{
ctrl2.Visible = true;
}
переместите код инициализации из .Load в свой собственный общедоступный метод и вызовите инициатор явно, когда это необходимо.