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

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()

Может кто-нибудь мне помочь?

Спасибо,

4b9b3361

Ответ 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.