ASP.Net条件数据绑定

9
<% if(Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES) {  %>
...  

<% } else { %>
...                                        

<% } %>

为什么会抛出 InvalidOperationException 异常?如何在 ASP 中编写条件 HTML 生成代码?

5个回答

28

按照John_所说的使用内联语句,或在您的代码后台创建一个执行所需逻辑的函数。

protected string MyFunction(int nbrOrders)
{
    if(nbrOrders>=Config.MAX_ENQUIRY_SALES)
    {
        return "TrueResult";
    }
    else
    {
        return "FalseResult";
    }
}

然后按如下方式使用

<%# MyFunction(Convert.ToInt32(Eval("NbrOrders"))) %>

编辑:我刚刚在另一个帖子的评论中看到了一条声明,它声称你想根据此结果显示不同的HTML。在这种情况下,您可以尝试使用包含代码的占位符的“可见”标志。例如:

<asp:PlaceHolder id="PlaceHolder1" runat="server" visible='<%# (Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES)%>'>
    <div>My True Html Here</div>
</asp:PlaceHolder>
<asp:PlaceHolder id="PlaceHolder2" runat="server" visible='<%# !(Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES)%>'>
    <div>My FalseHtml Here</div>
</asp:PlaceHolder>

3
修改功能是一个非常有用的提示。谢谢。 - Simon Keep

5
@Robin Day 的回答存在问题,如果您有数据绑定的子项,根据您正在渲染的任何内容的当前状态,这些子项可能具有或不具有数据,则以下代码将失败。 如果您拥有复杂的对象图,并且需要处理可空的数据绑定代码,则有时很难操作。例如,请考虑:
    <asp:PlaceHolder runat="server" Visible="<%# VisibleCondition() %>">

        <%# ((string)null).ToString("c") %> //an object that may have null data
                                            //given the visible condition
    </asp:PlaceHolder>

如果VisibleCondition()返回false,子控件仍会使用DataBind(),这可能导致上面示例中的NullReferenceException
以下是我认为更好的方法:
public class ConditionalPlaceHolder : PlaceHolder
{
    protected override void DataBindChildren()
    {
        if( this.Visible )
        {
            base.DataBindChildren();
        }
    }
}

以下是使用方法:

<web:ConditionalPlaceHolder runat="server" Visible="<%# VisibleCondition1() %>">
    //whatever databound code
    <%# ((string)notNullGivenVisibleCondition1).ToString() %>
    <p>But could be given visible condition 2</p>
</web:ConditionalPlaceHolder>

<web:ConditionalPlaceHolder runat="server" Visible="<%# VisibleCondition2() %>">
    //whatever databound code
    <%# ((string)notNullGivenVisibleCondition2).ToString() %>
    <p>But could be given visible condition 1</p>
</web:ConditionalPlaceHolder>

5

我不确定您是否可以为条件绑定添加括号,我知道的唯一方法是使用内联语句,如下所示:

<%# Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES) ? Eval("IfTrueValue") : Eval("IfFalseValue") %>

是的,我就猜到这个了……我的问题是每种情况下都需要生成一堆 HTML……ASP 排序的整个意义都失去了…… - Niels Bosma
@Neils Bosma,这也是我的答案。您无法将HTML与Eval绑定混合使用,但仍然可以在函数中生成HTML,然后将其放入您正在绑定的数据列中,然后使用Eval("YourColumn")调用它。 - vapcguy

-1

我在你的句子中找不到错误,但是你在 Config.MAX_ENQUIRY_SALES 和 Convert.ToInt32(Eval("NbrOrders")) 之间进行了比较。它们的运算符类型相同吗?你能在网页上展示每个运算符的类型吗?


-1

if/else语句块在ASP .NET中按照您的预期工作。以下代码可以正常运行。

<% if(DateTime.Now.Second % 2 == 0) {  %>
<div>Even</div>
<% } else { %>
<div>Odd</div>
<% } %>

也许你示例中的条件逻辑抛出了异常?


我认为是Eval引起了问题。你不能在数据绑定中混合条件逻辑。 - Simon Keep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接