2013-05-29 6 views
22

У меня есть некоторый код, который в основном выглядит следующим образом:Если заявления в 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: Причина, почему им отображение/скрытие это потому, что мне нужно, чтобы включить некоторые разметку вокруг контроля, если Something == true. Я мог бы обернуть «уникальную разметку» в if-else до и после элемента управления, но это просто кажется грязным для чего-то, что действительно должно быть таким простым, как я себе представлял выше. Сам пользовательский контроль должен быть точно таким же в обоих сценариях, извините за запутанное свойство, которое у него было.

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

+0

Это только вы, я думаю. –

+0

Почему бы не использовать codebehind? ваш элемент управления является серверным, поэтому при добавлении параметра ID вы можете установить свою настройку. и использовать его только один раз, как упоминал @ Кеннет в его ответе. – sasjaq

+0

Да, это действительно неинтуитивно. Но опять же, так же как и все WebForms! – theyetiman

ответ

34

Поскольку у вас есть два элемента управления на странице, они будут отображать их обоих. Выполнение 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 является истинным

+0

Я знаю, но есть много вещей, которые не должны отображаться вокруг пользовательского элемента управления. Будет обновлено исходное сообщение, чтобы прояснить это. –

+0

Простой, но эффективный, мне нравится –

+0

См. Редактирование сейчас. Атрибут 'SomeSetting' был не совсем моим моментом, он просто добавился, чтобы сделать больше различий между ними. : - \ –

1

Лучший способ, на мой взгляд, состоит в том, чтобы объявить ваш пользовательский контроль один раз в ASPX.

В за код, на PageLoad, применить логику вы посчитаете нужным:

if(something) 
    MyUserControl.SomeSettings = ... 

Если есть проблема в хронологии, сделать выше логики преднагрузки, так как он будет активироваться до загрузки страницы из страницы и всех связанных с ней пользовательских элементов управления.

EDIT:

Вы можете поместить два различных идентификаторов на пользовательских элементов управления с Enabled = False. В Page_load установите Enabled на один из них на основе желаемой логики.

+0

См. Edit, я удалил свойство 'SomeSetting', так как он не был действительно частью точки i пытаясь сделать. –

Смежные вопросы