Если утверждения в файлах aspx
У меня есть код, который выглядит примерно так:
<div>
<% if(Something) { %>
<div id="someUniqueMarkup">
This markup should not be output if Something==true.
<units:MyUserControl runat="server"/>
</div>
<% }
else { %>
<units:MyUserControl runat="server" />
<% } %>
</div>
В зависимости от Something
один из них скрыт, и это нормально. Но если я установил точки останова в пользовательском элементе управления, я заметил, что он загружается дважды (один раз для каждого из вышеперечисленных элементов управления), и все его логика запускается дважды. Я мог бы, конечно, контролировать это с помощью заполнителей или мультивизий, но то же самое, похоже, применяется - OnLoad
/Page_Load
и т.д. Запускается один раз для каждого элемента управления, который фактически находится на странице.
EDIT:
Причина, по которой im показывать/скрывать это, заключается в том, что мне нужно включить некоторую разметку вокруг элемента управления, если Something == true
. Я мог бы обернуть "уникальную разметку" в if-else до и после элемента управления, но это просто кажется грязным для чего-то, что действительно должно быть таким простым, как я себе представлял выше. Сам пользовательский контроль должен быть точно таким же в обоих сценариях, извините за запутанное свойство, которое у него было.
Это только я, или это просто неинтуитивный интерфейс? И действительно ли возможно вообще не загружать/выполнять пользовательский элемент, пока он находится на странице?
Ответы
Ответ 1
Поскольку у вас есть два элемента управления на странице, они будут отображать их оба. Выполнение if-check, только определяет, включено ли оно в выход. Самый простой способ предотвратить это - изменить свой код следующим образом:
<div>
<units:MyUserControl runat="server" SomeSetting="<%= Something %>" />
</div>
EDIT: ответьте на редактирование в исходном сообщении:
<div>
<% if(Something) { %>
<div id="someUniqueMarkup">
This markup should not be output if Something==true.
<asp:placeholder id="phItemInDiv" runat="server" />
</div>
<% }
else { %>
<asp:placeholder id="phItemOutsideDiv" runat="server" />
<% } %>
</div>
MyUserControl ctrl = (MyUserControl)LoadControl("/pathtousercontrol.ascx")
if (something){
phItemInDiv.Controls.Add(ctrl);
}
else{
phItemOutsideDiv.Controls.Add(ctrl);
}
Таким образом вы будете использовать только пользовательский элемент управления (и загружен), если Something
истинно
Ответ 2
Лучший способ, на мой взгляд, - объявить ваш пользовательский контроль один раз в ASPX.
В коде позади, на странице Load, примените логику, которая вам подходит:
if(something)
MyUserControl.SomeSettings = ...
Если в хронологии есть проблема, выполните описанную выше логику в PreLoad, так как она будет срабатывать до загрузки страницы и всех связанных с ней пользовательских элементов управления.
EDIT:
Вы можете поместить два разных идентификатора в пользовательские элементы управления с Enabled = false.
В Page_load установите Enabled для одного из них на основе желаемой логики.
Ответ 3
Лучше разместить держатель следующим образом
<asp:PlaceHolder runat="server" ID="plcUrl" Visible="<%# ShowUrl %>">
<div style="margin-right:40px;">
<small><%# Eval("ItemUrl") %></small>
</div>
</asp:PlaceHolder>
И измените значение ShowUrl (критерий видимости) в коде позади.