Ответ 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("...") %>
все еще работает даже внутри пользовательского элемента управления).