if语句中的eval?

 do magic  

给我错误:数据绑定方法,如Eval(),XPath()和Bind()只能在数据绑定控件的上下文中使用。

我可以写:<%#Eval(“SaveDate”)!= DBNull.Value? 做魔术但我需要在if语句中做很多html魔术。

我知道我应该添加#以便使用Eval,但不确定正确的语法。

一种解决方案是将内容包装在具有Visible值的runat =“server”标记中,例如,

 
do magic

div可以是任何HTML标记,但也可以使用 。 请注意,“do magic”仍然是数据绑定,因此如果它包含昂贵的代码或代码,如果Eval("SaveDate") == DBNull.Value可能会产生错误,则它不是一个完美的解决方案。

请注意, Visible="false"将从生成的HTML中省略标记及其所有内容,这意味着它与style="display:none"style="visible:hidden"非常不同,所以不要担心那。

但是,如果你的“魔术”相当复杂,另一个相当简单的解决方案(有点黑客)是:使用一个Repeater(或FormView),其DataSource设置为一个项目(可见)的数组或没有项目(隐藏) ):

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

数据源数组的实际内容为空(隐藏)或您已绑定到的元素。 这可以确保您仍然可以在ItemTemplate中调用<%# Eval(...) %>

使用这种方法,您的“do magic”是一个模板,只有在DataSource有一个或多个项目时才会执行。 由ElementIfTrue 。 这有点令人费解,但它可以偶尔拯救你。

作为旁注:在用户控件中打包“do magic”也可以降低复杂性。 您并不需要更改HTML / ASP.NET标记组合中的内容( <%# Eval("...") %>即使在用户控件内仍然有效)。

我通常添加一个受保护的函数,将一个字符串返回给代码隐藏以生成内容:

在页面上:

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

在我class上:

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