【问题标题】:Why can I not combine if and eval? And whats the best alternative?为什么我不能结合 if 和 eval?什么是最好的选择?
【发布时间】:2010-09-26 10:43:50
【问题描述】:

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

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

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

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

如果有这个选项就好了。

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

【问题讨论】:

  • 对对象使用常规内联代码效果更好
    ...我猜这个案子已经结案了

标签: asp.net


【解决方案1】:
<div runat="server" visible='<%# !String.IsNullOrEmpty(Eval("MyProp") as string) %>'>
    <%# Eval("MyProp") %>
</div>

编辑 2010/9/30

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

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

所以&lt;% ... %&gt; 代码块不起作用,但是&lt;%# ... %&gt; 代码块,又名data-binding expressions 呢?数据绑定表达式确实在页面生命周期的所需部分运行——在对 DataBind 的调用中。然而,这里的操作词是表达式if 语句不是表达式。您在&lt;%# ... %&gt; 之间抛出的任何内容都将由编译器作为表达式进行评估。如果在里面放一条语句,编译器会报错。

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

【讨论】:

  • visible="False" 会起作用,但您认为这不是一个优雅的解决方案吗?
  • 再想一想——这确实是一个不错的解决方案,它会从标记中忽略整个标签。 (我的第一个想法是它会添加 style="display:none"。)谢谢!
  • 感谢您的回复,这是我一直在努力解决的问题。
【解决方案2】:

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

【讨论】:

  • 对我没用,谷歌搜索我真的认为这是一条死胡同。
【解决方案3】:
<% if ((string)Eval("MyProp") != "")
 { %>
<div>
    <%# Eval("MyProp") %></div>
<%} %>

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

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2010-11-30
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多