Как я могу использовать Html.DisplayFor внутри итератора? - PullRequest
35 голосов
/ 06 августа 2010

Я люблю MVC 2. Все это так хорошо вписывается в сеть.

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

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

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

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

<% } %>

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

Ответы [ 5 ]

66 голосов
/ 06 августа 2010

На самом деле, я понял это. Как глупо с моей стороны.

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

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

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

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

<% } %>
12 голосов
/ 06 августа 2010

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

 <% 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);
   } %>
6 голосов
/ 20 марта 2015

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

Просмотр 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 принимает неявно типизированную лямбду, мы можем напрямую указать экземпляр для отображения в цикле.

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

3 голосов
/ 20 февраля 2014

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1 голос
/ 21 января 2016

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

@Html.DisplayFor(model => item.CreatedDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...