ASP.NET с использованием Bind / Eval в .aspx в операторе If - PullRequest
18 голосов
/ 08 апреля 2011

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

<% if(bool.Parse(Eval("IsLinkable") as string)){ %>                    
        monkeys!!!!!!
        (please be aware there will be no monkeys, 
        this is only for humour purposes)
 <%} %>

IsLinkable - это bool, пришедший из Binder.Я получаю следующую ошибку:

InvalidOperationException
Databinding methods such as Eval(), XPath(), and Bind() can only
be used in the context of a databound control.

Ответы [ 11 ]

19 голосов
/ 08 апреля 2011

Вам необходимо добавить свою логику к событию ItemDataBound ListView. В aspx у вас не может быть оператора if в контексте DataBinder: <%# if() %> не работает.

Посмотрите здесь: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listview.itemdatabound.aspx

Событие будет вызываться для каждого элемента, который будет привязан к вашему ListView, и поэтому контекст в событии связан с элементом.

Пример, посмотрите, можете ли вы настроить его в соответствии с вашей ситуацией:

protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        Label monkeyLabel = (Label)e.Item.FindControl("monkeyLabel");
        bool linkable = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable");
        if (linkable)
           monkeyLabel.Text = "monkeys!!!!!! (please be aware there will be no monkeys, this is only for humour purposes)";
    }
}
15 голосов
/ 08 апреля 2011

Я почти уверен, что вы можете сделать что-то вроде следующего

(заметьте, у меня нет компилятора, удобного для проверки точного синтаксиса)

text = '<%# string.Format("{0}", (bool)Eval("IsLinkable") ? "Monkeys!" : string.Empty) %>'

Да, это c #и вы используете vb.net, так что вам нужно будет использовать синтаксис vb для троичного оператора.

Редактировать - смог бросить в простую ситуацию привязки данных, работал как шарм.

7 голосов
/ 02 октября 2014

Вы можете использовать asp:PlaceHolder и в Visible можете поставить eval.Вроде как ниже

   <asp:PlaceHolder ID="plc" runat="server" Visible='<%# Eval("IsLinkable")%>'>
       monkeys!!!!!!
       (please be aware there will be no monkeys, this is only for humour purposes)
   </asp:PlaceHolder>
5 голосов
/ 30 июля 2017

Боже мой, это заняло слишком много времени, чтобы понять ...

<asp:PlaceHolder runat="server" Visible='<%# Eval("formula.type").ToString()=="0" %>'> Content <asp:PlaceHolder>

form.type - это столбец int связанной таблицы. Спасибо за другие вклады, чтобы получить мое разрешение.

4 голосов
/ 03 августа 2013

Я знаю, что для этого ответа немного поздно, но вот что стоит, вот мое решение проблемы:

<%# (bool)Eval("IsLinkable") ? "monkeys!!!!!!" : "" %>
4 голосов
/ 07 октября 2011

Если у вас возникли проблемы с получением e.Item.DataItem в ответе Bazzz, попробуйте

protected void ListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    using (ListViewDataItem listViewDataItem = (ListViewDataItem) e.Item)
    {
        if (listViewDataItem != null)
        {
            Label monkeyLabel = (Label)e.Item.FindControl("monkeyLabel");
            bool linkable = (bool)DataBinder.Eval(listViewDataItem , "IsLinkable");
            if (linkable)
               monkeyLabel.Text = "monkeys!!!!!! (please be aware there will be no monkeys, this is only for humour purposes)";
        }
    }
}
2 голосов
/ 23 июля 2014

Вы можете создать метод для оценки значения и вернуть желаемое значение.

<%# IsLinkableABool( Eval("IsLinkable") ) %>

В коде ниже вы можете создать метод следующим образом

protected String IsLinkableABool(String isLinkable)
{
    if (isLinkable == Boolean.TrueString)
    {
         return "monkeys!!!!!! (please be aware...";    
    }
    else
    {
         return String.Empty;
    }
}
1 голос
/ 08 апреля 2011

Всякий раз, когда мне нужно обработать условия в элементе управления с привязкой к данным, я использую событие OnItemDataBound .

Таким образом, вы можете сделать:

protected void DataBound_ItemDataBoundEvent() {
     bool IsLinkable            = (bool)DataBinder.Eval(e.Item.DataItem, "IsLinkable");  
     if(IsLinkable) {
          //do stuff
     }                                     

}
0 голосов
/ 25 мая 2017

Размещение условия aspx-страницы не очень хорошая идея. Также грязно. Вы можете использовать троичный оператор. Но я предлагаю вам использовать связанные с строкой события вида сетки. Шаг 1 - перейти к свойствам вида сетки. Нажмите кнопку освещения, чтобы просмотреть все события. Шаг 2 - укажите имя в строке данных и дважды щелкните

защищенный пустотный поток (отправитель объекта, GridViewRowEventArgs e)

   {
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        TableCell statusCell = e.Row.Cells[8];//Means column 9

        if (statusCell.Text == "0")
        {
            statusCell.Text = "No Doc uploaded";

        }
        else if (statusCell.Text == "1")
        {
            statusCell.Text = "Pending";
        }
        else if (statusCell.Text == "2")
        {
            statusCell.Text = "Verified";
        }
    }
}
0 голосов
/ 28 сентября 2011

Для FormView управления см. эту ссылку .

Вот пример кода. Моя страница aspx FormView Элемент управления выглядит следующим образом:

<asp:FormView ID="fv" runat="server" Height="16px" Width="832px"  
CellPadding="4" ForeColor="#333333" ondatabound="fv_DataBound"> 
    <ItemTemplate>
        <table>
            <tr>
                <td align="left" colspan="2" style="color:Blue;">
                    <asp:Label ID="lblPYN" runat="server" Text='<%# Eval("PreviousDegreeYN") %>'></asp:Label> 
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:FormView>

Я проверяю значение для <%# eval("PreviousDegreeYN") %>

Если мой eval("PreviousDegreeYN") == True, я хочу отобразить Да на моем ярлыке " lblPYN "

protected void fv_DataBound(object sender, EventArgs e)
{
    FormViewRow row = fv.Row;
    //Declaring Variable lblPYN
    Label lblPYN;
    lblPYN = (Label)row.FindControl("lblPYN");
    if (lblPYN.Text == "True")
    {
        lblPYN.ForeColor = Color.Blue;
        lblPYN.Text = "Yes";

    }
    else
    {
        lblPYN.ForeColor = Color.Blue;
        lblPYN.Text = "No";

    }
}
...