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

Как я могу использовать Html.DisplayFor внутри итератора?

Я люблю MVC 2. Все это просто подходит для Интернета так хорошо.

Существует одна функциональность, однако я не могу уговорить функцию Html.DisplayFor():

<@ Page Inherits="ViewPage<IEnumerable<Foo>>">

<% foreach(var item in Model) { %>

    <%: Html.DisplayFor(item.BarBaz) %>

<% } %>

Мне нужно использовать DisplayTemplate для этого значения. Есть ли способ сделать это?

4b9b3361

Ответ 1

Собственно, я понял это. Как глупо со мной.

Это работает:

<@ Page Inherits="ViewPage<IEnumerable<Foo>>">

<% foreach(var item in Model) { %>

    <%: Html.DisplayFor(m => item.BarBaz) %>

<% } %>

Ответ 2

Вы можете выполнить его, уйдя от foreach и используя обычный цикл:

 <% for (int i = 0; i < Model.Count(); i++) { %>

    <%: Html.DisplayFor(p=> p.ElementAt(i).BarBaz) %>

 <%} %>

Другой вариант - создать PartialView, который взял объект Foo и отобразил только ту информацию, которую вы хотели.

<% foreach (var item in Model)
   {
       Html.RenderPartial("FooBarBazLine", item);
   } %>

Ответ 3

Это старый вопрос, но я предполагаю, что кто-то может получить преимущества от моего решения:

Просмотр Aspx

<%@ Page Inherits="ViewPage<IEnumerable<Foo>>" %>

<% foreach (var item in Model) { %>

    <%: Html.DisplayFor(m => item) %>

<% } %>

Вид бритвы

@model IEnumerable<Foo>

@foreach (var item in Model)
{
    Html.DisplayFor(m => item)
}

Так как DisplayFor принимает неявный типизированный лямбда, мы можем напрямую указать экземпляр для отображения в цикле.

Наконец, я согласен с Андерсом Андерсеном ответить за использование шаблона

Ответ 4

Html.DisplayFor может автоматически перебирать коллекции, отображая частичный вид для каждого элемента в коллекции.

Первое, что вам нужно сделать, это создать фактический класс модели, при этом коллекция будет свойством класса.

public class Bar
{
    public IEnumerable<Foo> foo { get; set; }
}

Верните этот класс из своего контроллера вместо необработанной коллекции.

Во-вторых, вам нужен шаблон отображения для класса Foo. Шаблоны отображения - это частичные представления, которые необходимо поместить в папку Views/Shared/DisplayTemplates.

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

Вот пример синтаксиса бритвы:

@model YourNameSpace.Foo
<p>@Model.BarBaz</p>

Сохраните его как Foo.cshtml в папке DisplayTemplates, указанной выше.

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

Теперь в исходном представлении вы можете полностью избавиться от цикла и просто написать

@Html.DisplayFor(m => m.foo)

Примечание foo - это имя свойства в вашем новом классе модели, которое содержит старую коллекцию, которую вы зацикливали раньше.

DisplayFor автоматически узнает, что свойство foo имеет тип (набор) foo и выбирает шаблон Foo.cshtml в папке DisplayTemplates и показывает его один раз для каждого элемента в foo.

Ответ 5

В Razor я использую

@Html.DisplayFor(model => item.CreatedDate)