LabelFor() в foreach
У меня есть представление с сильно типизированной моделью, связанной с ней
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<SomeNamespace.SomeViewModel>" %>
SomeViewModel выглядит так:
class SomeViewModel
{
public IEnumerable<Foo> Foos {get; set;}
}
и скажем, что Foo
class Foo
{
public string Bar {get; set;}
}
и в представлении
<% foreach (var item in Model.Foos) { %>
<tr>
<td>
<%= Html.LabelFor(f => f.Bar) %>
</td>
Я не уверен, как отобразить свойство Bar
в item
с помощью Html.LabelFor()
Может кто-нибудь мне помочь?
Спасибо,
Ответы
Ответ 1
Вы пробовали
<% for (var i=0; i<Model.Foos.Count();i++) { %>
<tr>
<td>
<%= Html.LabelFor(f => f.Foos[i].Bar) %>
</td>
Расширение LabelFor использует выражение lamda для перехода от вашего объекта модели к выбранному свойству, рассмотрите f переменную подстановки для вашей модели. Таким образом, вам нужен способ получить от вашей модели выбранную вами собственность. Вы сообщаете LabelFor, создайте локальную переменную f и присвойте ей значение вашей модели. затем используйте бит после = > , чтобы определить целевое свойство.
Если вы отчаянно нуждаетесь в использовании foreach, вам придется иметь способ перевести элемент обратно в свойство исходной модели (например, для массива, как сказал Gledrius x=>x.Foos[Model.Foos.IndexOf(foo)])
если вам просто нужно текстовое значение
используйте '<% = item% > ' вместо всего labelfor, или если у вас есть ASP.NET 4 и MVC2 или лучше использовать <%: item %>
для этой HTML-кодировки доброты
Ответ 2
Сделайте это вместо:
<% foreach (var item in Model.Foos) { %>
<tr>
<td>
<%= Html.LabelFor(f => item.Bar) %>
</td>
<% } %>
Вместо f = > f.Bar do f = > item.Bar, где item - это имя переменной в вашем цикле foreach.
Вот гораздо более красивый синтаксис бритвы:)
@foreach( var item in Model.Foos ) {
<tr>
<td>
@Html.LabelFor(f => item.Bar)
</td>
<td>
@Html.DisplayFor(f => item.Bar)
</td>
</tr>
}
Ответ 3
Вы также можете просто написать настраиваемое расширение, которое не привязано непосредственно к модели страницы.
public static MvcHtmlString LabelForItem<T, V>(this HtmlHelper html, T obj, Expression<Func<T, V>> expression)
{
Func<T,V> func = expression.Compile();
V val = func(obj);
return html.Label(val.ToString());
}
И вы будете использовать его, например:
@foreach (Foo foo in Model)
{
<p>
@(Html.LabelForItem<Foo, string>(foo, f => f.Name))
</p>
}
Ответ 4
Из здесь, похоже, вам нужно указать DisplayName
на свойстве:
[DisplayName("My Bar")]
public string Bar { get; set; }
Ответ 5
если список Foos будет списком, он будет выглядеть так:
Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)])
Ответ 6
Вы повторяете свой Foo, но не используете переменную item.