оценка, в если оператор?

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

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

Я мог записать: <% # Оценка ("SaveDate")! = DBNull. Значение? сделайте волшебство, Но я должен выполнить в большом волшебстве HTML если оператор.

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

21
задан Stewie Griffin 11 August 2010 в 19:37
поделиться

2 ответа

Одно из решений - заключить контент в тег runat = "server" со значением Visible, например,

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

div может быть любым тегом HTML, но и также можно использовать. Обратите внимание, что «do magic» по-прежнему привязано к данным, поэтому это не идеальное решение, если оно содержит дорогостоящий код или код, который может вызвать ошибку, если 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 ("...")%> по-прежнему работает даже внутри пользовательского элемента управления).

30
ответ дан 29 November 2019 в 20:47
поделиться

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

На странице:

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

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

protected string GenerateContent()
{
    return "Hello, World!"
}
8
ответ дан 29 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: