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



Answers

Вы можете выполнить это, уйдя от 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);
   } %>
Question

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

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

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

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

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

<% } %>

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




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 в папке Foo.cshtml указанной выше.

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

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

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

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

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






Links