<% if(Eval("SaveDate") != DBNull.Value){ %>
do magic
<%} %>
Run Code Online (Sandbox Code Playgroud)
给我错误:数据绑定方法,如Eval(),XPath()和Bind()只能在数据绑定控件的上下文中使用.
我可以写:<%#Eval("SaveDate")!= DBNull.Value?做魔法但我需要在if语句中做很多html魔术.
我知道我应该添加#以便使用Eval,但不确定正确的语法.
Rub*_*ben 30
一种解决方案是将内容包装在具有Visible值的runat ="server"标记中,例如,
<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'>
do magic
</div>
Run Code Online (Sandbox Code Playgroud)
div
可以是任意的HTML标签,但<asp:Panel>
并<asp:PlaceHolder>
也可使用.请注意,"do magic"仍然是数据绑定,因此如果它包含昂贵的代码或代码可能会产生错误,那么它就不是一个完美的解决方案Eval("SaveDate") == DBNull.Value
.
请注意,Visible="false"
将从生成的HTML中省略标记及其所有内容,这意味着它与style="display:none"
或非常不同style="visible:hidden"
,因此不必担心.
但是,如果你的"施魔法" 是相当复杂的,另一种比较简单的解决方案(一个黑客位的)是:使用一个中继器(或FormView控件)与它的数据源设置为一个项目(可见)的阵列或任何项目(隐藏):
<asp:Repeater runat="server" DataSource='<%# ElementIfTrue(Eval("SaveDate") != DBNull.Value) %>'
<ItemTemplate>
do magic
</ItemTemplate>
</asp:Repeater>
protected IEnumerable ElementIfTrue(bool condition)
{
if (condition)
return new object[] { Page.GetDataItem() };
else
return new object[0];
}
Run Code Online (Sandbox Code Playgroud)
数据源数组的实际内容为空(隐藏)或您已绑定到的元素.这可以确保您仍然可以调用<%# Eval(...) %>
ItemTemplate.
使用这种方法,您的"do magic"是一个模板,只有在DataSource有一个或多个项目时才会执行.由谁来照顾ElementIfTrue
.这有点令人费解,但它可以偶尔拯救你.
作为旁注:在用户控件中打包"do magic"也可以降低复杂性.您实际上不需要更改HTML/ASP.NET标记组合中的内容(<%# Eval("...") %>
即使在用户控件内仍然有效).
我通常添加一个受保护的函数,将一个字符串返回给代码隐藏以生成内容:
在页面上:
<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %>
Run Code Online (Sandbox Code Playgroud)
在我班上:
protected string GenerateContent()
{
return "Hello, World!"
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31657 次 |
最近记录: |