Html.DisplayFor może automatycznie iteracyjne nad zbiorami, wyświetlając częściowy widok dla każdego elementu w kolekcji.
Pierwszą rzeczą, którą musisz zrobić, to stworzyć rzeczywistą klasę modelu, której kolekcja jest własnością klasy.
public class Bar
{
public IEnumerable<Foo> foo { get; set; }
}
Powróć tę klasę ze swojego kontrolera zamiast z surowej kolekcji.
Po drugie potrzebujesz szablonu wyświetlania dla klasy Foo. Szablony wyświetlania to widoki częściowe, które należy umieścić w folderze Views/Shared/DisplayTemplates
.
Edytuj: Możesz je również umieścić w podfolderze kontrolera w widokach, jeśli chcesz ograniczyć szablon do określonego kontrolera. Aby uzyskać więcej informacji, patrz this question.
Oto przykład składni brzytwa:
@model YourNameSpace.Foo
<p>@Model.BarBaz</p>
zapisać go jako Foo.cshtml
w folderze DisplayTemplates
podanym powyżej.
Ten szablon jest dość prosty, ponieważ opiera się na przykładzie, w którym wyświetlasz tylko ciąg znaków, ale jeśli elementy kolekcji, w których klasa ma własne właściwości, możesz utworzyć bardziej złożony szablon.
Teraz w oryginalnym widoku można pozbyć pętli całkowicie i po prostu napisać
@Html.DisplayFor(m => m.foo)
Wskazówka foo
to nazwa obiektu w nowej klasie modelu, który zawiera starą kolekcję masz zapętlone nad przed .
Displayfor automatycznie wiedzieć, że nieruchomość foo
jest typu (zbieranie) Foo
i podnieść szablon w folderze DisplayTemplates
Foo.cshtml
i pokazać go raz dla każdego elementu foo
.
Myślę, że jestem jeszcze bardziej głupi, ponieważ nie jestem pewien, jak to interpretować. Formalny parametr lambda m nie jest używany w wyrażeniu. Czy jest to tylko tam, ponieważ jest wymagane przez _DisplayFor_? Ponadto, oczekiwałem, że '@ Html.Display (item.BarBaz)' będzie działał równie dobrze, ale to niczego nie renderuje. –
@ R.Schreurs Wydaje się, że lambda musi być wyrażeniem "Func", które przyjmuje typ modelu jako parametr, ale może zwrócić wszystko. – JohnnyHK
Jestem też głupi :) –