asp.net - 为什么我不能结合 if 和 eval?什么是最好的选择?

标签 asp.net

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

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

但不可能与条件语句结合是吗?:
<% if (Eval("MyProp")!="") { %>
<div><%# Eval("MyProp") %></div>
<%} %>

有这个选项会很高兴。

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

最佳答案

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

编辑 2010/9/30

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

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

所以<% ... %>代码块不起作用,但是 <%# ... %> 呢?代码块,又名 data-binding expressions ?数据绑定(bind)表达式确实在页面生命周期的所需部分运行——在对 DataBind 的调用中。然而,这里的关键词是表达。一个 if语句不是表达式。你在 <%# ... %> 之间扔的任何东西将由编译器作为表达式进行评估。如果你把一个语句放在那里,编译器会抛出一个错误。

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

关于asp.net - 为什么我不能结合 if 和 eval?什么是最好的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3797452/

相关文章:

asp.net - 如何在 ASP.NET Application_Error 事件中确定当前请求是否为异步回发

asp.net - 使用 ASP.NET session 时是否可以强制请求并发?

c# - 无法执行 URL - 有什么想法吗?

c# - 分层架构。正确地做

c# - div 标题的客户端更改未反射(reflect)在后面的 C# 代码中

javascript - zurb Foundation 5.2 - 在 postabck 上维护选项卡选择/状态

javascript - 如何从 JQUERY 中的 HTML 文档获取 XML 对象

c# - ASP.NET - 如何使用 MVC 模式通过服务器端代码 (C#) 加载页面?

c# - 如何从mysql查询中多行的同一列中获取总值?

c# - ASP.NET Identity自动注册Claims用户