if语句中的eval?

时间:2010-08-11 19:37:55

标签: c# asp.net eval

 <% if(Eval("SaveDate") != DBNull.Value){ %>
     do magic                           
 <%} %>

给我错误:数据绑定方法(如Eval(),XPath()和Bind()只能在数据绑定控件的上下文中使用。

我可以写:&lt;%#Eval(“SaveDate”)!= DBNull.Value?做魔术 但我需要在if语句中做很多html魔术。

我知道我应该添加#才能使用Eval,但不确定正确的语法。

2 个答案:

答案 0 :(得分:30)

一种解决方案是将内容包装在带有Visible值的runat =“server”标记中,例如,

<div runat="server" Visible='<%# Eval("SaveDate") != DBNull.Value %>'>
   do magic
</div>

div可以是任何HTML代码,但也可以使用<asp:Panel><asp:PlaceHolder>。请注意,“do magic”仍然是数据绑定,因此如果它包含昂贵的代码或代码,如果Eval("SaveDate") == DBNull.Value可能会生成错误,则它不是一个完美的解决方案。

请注意,Visible="false"会从生成的HTML中省略标记及其所有内容,这意味着它与style="display:none"style="visible:hidden"非常不同,所以不要担心

但是,如果你的“做魔术” 相当复杂,另一个相当简单的解决方案(有点黑客)是:使用一个Repeater(或FormView),其DataSource设置为一个数组一个项目(可见)或没有项目(隐藏):

<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];
}

数据源数组的实际内容为空(隐藏)或您已绑定到的元素。这样可以确保您仍然可以在ItemTemplate中调用<%# Eval(...) %>

使用这种方法,你的“做魔法”是一个模板,只有在DataSource有一个或多个项目时才会执行。由ElementIfTrue处理。这有点令人费解,但它可以偶尔拯救你。

作为旁注:在用户控件中打包“do magic”也可以降低复杂性。您实际上不需要更改HTML / ASP.NET标记组合中的内容(<%# Eval("...") %>甚至可以在用户控件中使用)。

答案 1 :(得分:8)

我通常添加一个受保护的函数,将一个字符串返回给代码隐藏以生成内容:

在页面上:

<%# Eval("SaveDate") != DBNull.Value ? GenerateContent() : string.Empty %>

在我班上:

protected string GenerateContent()
{
    return "Hello, World!"
}