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.
Ответы
Ответ 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";
}
}
}