为什么我不能将if和eval结合起来?最新的选择是什么?

时间:2010-09-26 10:43:51

标签: asp.net

在Asp Net数据绑定控件中,可以使用漂亮的Eval()语法:

<div><%# Eval("MyProp") %></div>

但是它不可能与条件语句结合使用吗?:

<% if (Eval("MyProp")!="") { %>
<div><%# Eval("MyProp") %></div>
<%} %>

拥有该选项会很高兴。

所以 - 我的选择是将部分标记放在CodeBehind中。我真的很喜欢把它放在那里。还有其他可能性吗?

3 个答案:

答案 0 :(得分:7)

<div runat="server" visible='<%# !String.IsNullOrEmpty(Eval("MyProp") as string) %>'>
    <%# Eval("MyProp") %>
</div>

修改2010/9/30

现在我有一点时间,我觉得我应该扩展我的答案。特别是考虑到问题是重复已经a better answer而不是我原来的。所以我将解决你问题的第一部分:

为什么你不能将if和eval结合起来?原因是<% ... %>代码块在页面生命周期的呈现阶段期间执行。 ASP.NET将您的代码(在本例中为if语句)放入函数中,然后将该函数作为委托传递给SetRenderMethodDelegate。问题是Eval评估Page.GetDataItem返回的对象上的表达式“MyProp”。 Page.GetDataItem 有点神奇,只有在调用堆栈中先前调用DataBind时才会返回一个值。到渲染阶段到来时,所有数据绑定都已完成。因此,当您调用 Eval (隐式调用 Page.GetDataItem )时,会抛出以下错误:“数据绑定方法[...]只能用于上下文中数据绑定控制。“

所以<% ... %>代码块不起作用,但是<%# ... %>代码块,a.k.a。data-binding expressions呢?数据绑定表达式确实在页面生命周期的所需部分中运行 - 在对 DataBind 的调用中。但是,这里的操作词是表达式if语句不是表达式。您在<%# ... %>之间抛出的任何内容都将由编译器作为表达式进行评估。如果你在那里放一个语句,编译器将抛出一个错误。

因此,我们得出了在控件的 Visible 属性上的数据绑定表达式中调用 Eval 的习语。 Eval与数据绑定表达式兼容;编写表达式足以分配属性的值;并且 Visible 属性能够实现类似于使用内联if语句的效果。 最后提示:如果您最终遇到没有任何现有控制权来自然添加可见条件的情况,您可以随时使用<asp:PlaceHolder>,这个控件不会t将任何标签添加到标记中。

答案 1 :(得分:1)

这是因为Eval("MyProp")返回对象而你无法将对象与字符串进行比较。您可能需要将其强制转换为字符串(如果MyProp当然是类型字符串)。

答案 2 :(得分:-1)

<% if ((string)Eval("MyProp") != "")
 { %>
<div>
    <%# Eval("MyProp") %></div>
<%} %>

<%# (string)Eval("MyProp") != "" ? string.Format("<div>{0}</div>", Eval("MyProp")) : "" %>