Подтвердить что ты не робот

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

Это только я, или это просто неинтуитивный интерфейс? И действительно ли возможно вообще не загружать/выполнять пользовательский элемент, пока он находится на странице?

4b9b3361

Ответ 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 (критерий видимости) в коде позади.