【问题标题】:ASP.Net conditional databindingASP.Net 条件数据绑定
【发布时间】:2009-03-17 09:16:58
【问题描述】:
<% if(Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES) {  %>
...  

<% } else { %>
...                                        

<% } %>

给我一​​个 InvalidOperationException?如何在 ASP 中编写条件 html 生成?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

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

    然后如下使用这个

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

    编辑:我刚刚阅读了另一篇文章的评论,指出您希望根据此结果显示不同的 HTML。在这种情况下,您可以尝试使用包含您的代码的占位符的 Visible 标志。如:

    <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>
    

    【讨论】:

    • 编辑是一个非常有用的提示。谢谢。
    【解决方案2】:

    我不确定你是否可以为条件绑定添加括号,我知道的唯一方法是使用这样的内联语句:

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

    【讨论】:

    • 是的,我怀疑这个......我的问题是我需要在每种情况下生成一堆html......失去了ASP排序的全部意义......
    • @Neils Bosma,这也是我的回答。您将无法将 HTML 与 Eval 绑定混合使用,但仍然可以在您的函数中生成 HTML,然后将其放入您正在绑定的数据列中,然后使用 Eval("YourColumn") 调用。
    【解决方案3】:

    @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>
    

    【讨论】:

      【解决方案4】:

      我在您的句子中找不到错误,但您在 Config.MAX_ENQUIRY_SALES 和 Convert.ToInt32(Eval("NbrOrders")) 之间进行了比较。这些运算符是否属于同一类型?你能在你的网页中显示每一个的类型吗?

      【讨论】:

        【解决方案5】:

        if/else 块在 ASP .NET 中按您期望的那样工作。以下工作正常。

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

        也许您示例中的条件逻辑引发了异常?

        【讨论】:

        • 我认为是导致问题的 Eval。您不能在数据绑定中混合条件逻辑。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 2010-11-29
        相关资源
        最近更新 更多