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
.