<% if(Eval("SaveDate") != DBNull.Value){ %>
do magic
<%} %>
дает мне ошибку: Связывание с данными методов, таких как Оценка (), XPath (), и Связывает (), может только использоваться в контексте связанного с данными управления.
Я мог записать: <% # Оценка ("SaveDate")! = DBNull. Значение? сделайте волшебство, Но я должен выполнить в большом волшебстве HTML если оператор.
Я знаю, что должен добавить # для использования Оценки, но не уверенный в правильном синтаксисе.
Одно из решений - заключить контент в тег 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 ("...")%>
по-прежнему работает даже внутри пользовательского элемента управления).
Я обычно добавляю защищенную функцию, возвращающую строку в код программной части для генерации содержимого:
На странице:
<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %>
В моем классе:
protected string GenerateContent()
{
return "Hello, World!"
}