2014-02-21 8 views
1

Простой пример: (.NET 3,5)Как изменить разметку/шаблон внутри DataList> ItemTemplate условно на данные?

  1. SqlDataSource возвращение col_a и колонны COL_B,

  2. управления DataList с помощью SqlDataSource

  3. внутри "шаблона элемента" Я хочу имеют различные секции в зависимости от значений A и B:

    <ItemTemplate> 
    <span class="item_title"><%# Eval("COL_A")%></span><br/> 
    
    <% if (GET_DATA("COL_B") > 100) 
    { 
    %> 
        <span>SOMETHING HERE</span> 
    
    <% } 
    else 
    { 
    %> 
        <span>DIFFERENT MARKUP HERE</span> 
        <span>SOMETHING COMPLETELY DIFFERENT HERE</span> 
    <% 
    } 
    %> 
    

Вопрос: Что использовать вместо GET_DATA для доступа к значению, переданному из SQL?

+0

Я отредактировал ваше название.Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Использование кода сценария, подобного этому, вероятно, не сработает. Я не думаю, что вы можете смешивать скрипт с шаблонами: скрипт интерпретируется в другое время от привязки данных.

Однако у вас есть UserControl в ItemTemplate, который определяет свойство для ColB и отображает разную разметку в зависимости от значения COL_B.

<ItemTemplate> 
    <span class="item_title"><%# Eval("COL_A")%></span><br/> 

    <uc1:UserControl1 runat="server" ColB='<%# (int)Eval("COL_B") %>' /> 
</ItemTemplate> 

Затем в управлении пользователем разметке у вас есть два или более элементов управления панели:

<asp:Panel id="panel1" runat="server"> 
    <span>SOMETHING HERE</span> 
</asp:Panel> 
<asp:Panel id="panel2" runat="server"> 
    <span>DIFFERENT MARKUP HERE</span> 
    <span>SOMETHING COMPLETELY DIFFERENT HERE</span> 
</asp:Panel> 

..., а затем в вашем случае PreRender в пользовательском элементе управления фонового кода (не используйте нагрузки , потому что ваш связывании в родительском не будет еще и произошло):

panel1.Visible = false; 
panel2.Visible = false; 
if(this.ColB > 100) 
    panel1.Visible = true; 
else 
    panel2.Visible = true; 

вы можете продвигать эти два элемента управления панели для вашей родительской страницы, но тогда вам придется сделать вызов .FindControl() в Обработчик события ItemDataBound в orde r, чтобы изменить их свойства и извлечь значение COL_B из свойства e.Item.DataItem. Множество извлечения значений и литья.

1

Условная разметка не поддерживается в ItemTemplate. Лучшее, что вы можете сделать здесь, чтобы сделать ваши пролеты на сторону сервера и манипулировать их свойства Видимых:

<ItemTemplate> 
    <span class="item_title"><%# Eval("COL_A")%></span><br/> 

    <span runat="server" Visible='<%# (int)Eval("COL_B") > 100 %>'> 
     SOMETHING HERE 
    </span> 
    <span runat="server" Visible='<%# (int)Eval("COL_B") <= 100 %>'> 
     DIFFERENT MARKUP HERE 
    </span> 
    ... 

Или вы можете обернуть их в заполнителях, если вы хотите - может быть немного чисты решением.

0

Спасибо всем за ваш вклад, он направил меня к решению.

Я, однако, нашел другое решение, которое я буду делиться здесь, как это аккуратно и просто:

asp:PlaceHolder 

Элемент может быть вложенными несколько раз, чтобы генерировать очень чистый вывод HTML. Пример ниже:

<asp:DataList ID="DataListLeft" runat="server" DataSourceID="SqlDataSource1" 
    RepeatLayout="Flow" RepeatDirection="Horizontal" > 
    <ItemTemplate>      
     <asp:PlaceHolder ID="PlaceHolder1" runat="server" 
      Visible='<%# !String.IsNullOrEmpty((string)Eval("COL_A", "{0}")) %>' > 

      SOME HTML MARKUP HERE WHEN COL_A HAS A VALUE 
      NOTE THE '!' IN CONDITION 

     </asp:PlaceHolder> 
     <asp:PlaceHolder ID="PlaceHolder2" runat="server" 
      Visible='<%# String.IsNullOrEmpty((string)Eval("COL_A", "{0}")) %>' > 

      SOME HTML MARKUP HERE WHEN COL_A IS NULL OR EMPTY 
      eg. <span>Data is not available</span> 

     </asp:PlaceHolder> 
    </ItemTemplate> 
</asp:DataList> 

Опять же, спасибо за ваше время.

JK