在Asp Net数据绑定控件中,可以使用漂亮的Eval()语法:
<div><%# Eval("MyProp") %></div>
Run Code Online (Sandbox Code Playgroud)
但是它不可能与条件语句结合使用吗?:
<% if (Eval("MyProp")!="") { %>
<div><%# Eval("MyProp") %></div>
<%} %>
Run Code Online (Sandbox Code Playgroud)
有这个选择会很高兴.
所以 - 我的选择是将部分标记放在CodeBehind中.我真的很喜欢把它放在那里.还有其他可能吗?
<div runat="server" visible='<%# !String.IsNullOrEmpty(Eval("MyProp") as string) %>'>
<%# Eval("MyProp") %>
</div>
Run Code Online (Sandbox Code Playgroud)
编辑2010/9/30
现在我有一点时间,我觉得我应该扩展我的答案.特别是考虑到问题是重复,已经有比我原来更好的答案.所以我将解决你问题的第一部分:
你为什么不把if和eval结合起来?原因是<% ... %>代码块在页面生命周期的呈现阶段执行.ASP.NET将您的代码(在本例中为if语句)放入函数中,然后将该函数作为委托传递给SetRenderMethodDelegate.问题是Eval在Page.GetDataItem返回的对象上计算表达式"MyProp" .Page.GetDataItem有点神奇,只有在调用堆栈中先前调用DataBind时才返回一个值.到渲染阶段到来时,所有数据绑定都已完成.因此,当您调用Eval时,它会隐式调用Page.GetDataItem,抛出以下错误:"数据绑定方法[...]只能在数据绑定控件的上下文中使用."
所以<% ... %>代码块不起作用,但<%# ... %>代码块又称数据绑定表达式呢?数据绑定表达式确实在页面生命周期的所需部分中运行 - 在对DataBind的调用中.但是,这里的操作词是表达.一种if说法是不是一个表达式.您抛出的任何内容都<%# ... %>将由编译器作为表达式进行评估.如果你在那里放一个语句,编译器将抛出一个错误.
因此,我们得出了在控件的Visible属性上的数据绑定表达式中调用Eval的习语.Eval与数据绑定表达式兼容; 编写表达式足以分配属性的值; 并且Visible属性能够实现类似于使用内联语句的效果.最后提示:如果您最终遇到没有任何现有控件以自然添加可见条件的情况,您可以始终使用<asp:PlaceHolder>,一个不向标记添加任何标记的控件.if
| 归档时间: |
|
| 查看次数: |
3987 次 |
| 最近记录: |