ASP.Net условная привязка данных - PullRequest
9 голосов
/ 17 марта 2009
<% if(Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES) {  %>
...  

<% } else { %>
...                                        

<% } %>

Дает ли мне InvalidOperationException? Как написать условную генерацию HTML в ASP?

Ответы [ 5 ]

28 голосов
/ 17 марта 2009

Используйте встроенный оператор как состояния 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>
5 голосов
/ 09 июля 2011

Проблема с ответом @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 голосов
/ 17 марта 2009

Я не уверен, что вы можете добавить квадратные скобки для условного связывания, единственный известный мне способ это сделать с помощью встроенного оператора, например, так:

<%# Convert.ToInt32(Eval("NbrOrders"))>=Config.MAX_ENQUIRY_SALES) ? Eval("IfTrueValue") : Eval("IfFalseValue") %>
0 голосов
/ 17 марта 2009

if / else блоки работают в ASP .NET так, как вы ожидаете. Следующее работает просто отлично.

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

Возможно, условная логика в вашем примере вызывает исключение?

0 голосов
/ 17 марта 2009

Я не могу найти что-то неправильное в ваших предложениях, но вы сделали сравнение между Config.MAX_ENQUIRY_SALES и Convert.ToInt32 (Eval ("NbrOrders")) Это оператор одного типа? Можете ли вы показать тип каждого на своей веб-странице?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...