if语句中的eval?

Ste*_*fin 21 c# asp.net eval

 <% 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("...") %>即使在用户控件内仍然有效).


kbr*_*ton 8

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

在页面上:

<%# 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)