<% if(Eval("SaveDate") != DBNull.Value){ %>
do magic
<%} %>
给我错误:数据绑定方法(如Eval(),XPath()和Bind()只能在数据绑定控件的上下文中使用。
我可以写:&lt;%#Eval(“SaveDate”)!= DBNull.Value?做魔术 但我需要在if语句中做很多html魔术。
我知道我应该添加#才能使用Eval,但不确定正确的语法。
答案 0 :(得分:30)
一种解决方案是将内容包装在带有Visible值的runat =“server”标记中,例如,
<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'>
do magic
</div>
div
可以是任何HTML代码,但也可以使用<asp:Panel>
和<asp:PlaceHolder>
。请注意,“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];
}
数据源数组的实际内容为空(隐藏)或您已绑定到的元素。这样可以确保您仍然可以在ItemTemplate中调用<%# Eval(...) %>
。
使用这种方法,你的“做魔法”是一个模板,只有在DataSource有一个或多个项目时才会执行。由ElementIfTrue
处理。这有点令人费解,但它可以偶尔拯救你。
作为旁注:在用户控件中打包“do magic”也可以降低复杂性。您实际上不需要更改HTML / ASP.NET标记组合中的内容(<%# Eval("...") %>
甚至可以在用户控件中使用)。
答案 1 :(得分:8)
我通常添加一个受保护的函数,将一个字符串返回给代码隐藏以生成内容:
在页面上:
<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %>
在我班上:
protected string GenerateContent()
{
return "Hello, World!"
}