Подтвердить что ты не робот

ASP.NET с использованием Bind/Eval в .aspx в выражении If

в моем .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.
4b9b3361

Ответ 1

Вам нужно добавить свою логику в событие ItemDataBound ListView. В aspx у вас не может быть if-statement в контексте 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)";
    }
}

Ответ 2

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

(Примечание. У меня нет компилятора для проверки точного синтаксиса)

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

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

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

Ответ 3

Вы можете использовать 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>

Ответ 4

Если у вас возникли проблемы с получением 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)";
        }
    }
}

Ответ 5

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

<%# (bool)Eval("IsLinkable") ? "monkeys!!!!!!" : "" %>

Ответ 6

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

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

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

protected String IsLinkableABool(String isLinkable)
{
    if (isLinkable == Boolean.TrueString)
    {
         return "monkeys!!!!!! (please be aware...";    
    }
    else
    {
         return String.Empty;
    }
}

Ответ 7

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

Итак, вы можете сделать:

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

}

Ответ 8

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

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

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

Ответ 9

Нам нужно будет увидеть остальную часть вашего кода, но сообщение об ошибке дает мне немного подсказки. Вы можете ТОЛЬКО использовать Eval, когда находитесь внутри элемента управления, привязанного к данным. SOmething, например, ретранслятор, datagrid и т.д.

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

Ответ 10

Для 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";

    }
}

Ответ 11

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

protected void onrow (отправитель объекта, 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";
        }
    }
}