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

Eval в выражении if?

 <% if(Eval("SaveDate") != DBNull.Value){ %>
     do magic                           
 <%} %>

дает мне ошибку: методы привязки данных, такие как Eval(), XPath() и Bind(), могут использоваться только в контексте управления базой данных.

Я мог бы написать: <% # Eval ( "SaveDate" )!= DBNull.Value? делать магию Но мне нужно сделать много команд html magic в if.

Я знаю, что я должен добавить #, чтобы использовать Eval, но не уверен в правильном синтаксисе.

4b9b3361

Ответ 1

Одним из решений является перенос содержимого в тег runat = "server" с видимым значением, например,

<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'>
   do magic
</div>

div может быть любым тегом HTML, но <asp:Panel> и <asp:PlaceHolder> также могут использоваться. Обратите внимание, что "делать волшебство" по-прежнему является привязкой к базе данных, поэтому это не идеальное решение, если оно содержит дорогой код или код, который мог бы генерировать ошибку, если Eval("SaveDate") == DBNull.Value.

Обратите внимание, что Visible="false" опускает тег и все его содержимое из сгенерированного HTML, это означает, что он сильно отличается от style="display:none" или style="visible:hidden", поэтому не беспокойтесь об этом.

Но если ваша "магия" достаточно сложна, другое довольно простое решение (немного взлома): используйте Repeater (или FormView) с его DataSource, установленным в массив из одного элемента (видимый) или нет пункты (скрытые):

<asp:Repeater runat="server" DataSource='<%# ElementIfTrue(Eval("SaveDate") != DBNull.Value) %>'
    <ItemTemplate>
        do magic
    </ItemTemplate>
</asp:Repeater>

protected IEnumerable ElementIfTrue(bool condition) 
{
    if (condition)
        return new object[] { Page.GetDataItem() };
    else
        return new object[0];
}

Фактическое содержимое массива данных является либо пустым (скрытым), либо элементом, к которому вы уже привязывались. Это гарантирует, что вы все равно можете вызвать <%# Eval(...) %> внутри ItemTemplate.

При таком подходе ваша "магия" - это шаблон, который будет выполняться только в том случае, если у DataSource есть один или несколько элементов. Об этом заботится ElementIfTrue. Это немного изгиб ума, но он может сэкономить вам время от времени.

В качестве побочного примечания: упаковка вашей "магии" в пользовательском элементе управления также может снизить сложность. Вам не нужно ничего менять в тэге HTML/ASP.NET(<%# Eval("...") %> все еще работает даже внутри пользовательского элемента управления).

Ответ 2

Обычно я добавляю защищенную функцию, возвращающую строку в код для создания содержимого:

На странице:

<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %>

В моем классе:

protected string GenerateContent()
{
    return "Hello, World!"
}