뷰 내부에 @foreach가있는 것은 안된다고 들었습니다. 의미, 뷰에는 논리가 없어야합니다. @foreach에 대한 논리가 있어야하는 위치에 대한 모범 사례는 무엇입니까?
@foreach..
답변
@foreach에 대한 논리가 있어야하는 위치에 대한 모범 사례는 무엇입니까?
아무데도 그냥 제거하십시오. 편집기 또는 디스플레이 템플릿을 사용할 수 있습니다.
예를 들면 다음과 같습니다.
@foreach (var item in Model.Foos)
{
<div>@item.Bar</div>
}
디스플레이 템플릿으로 완벽하게 대체 할 수 있습니다.
@Html.DisplayFor(x => x.Foos)
그런 다음 해당 디스플레이 템플릿을 정의합니다 ( 기본 템플릿이 마음에 들지 않는 경우 ). 따라서 ~/Views/Shared/DisplayTemplates/Foo.cshtml
Foos 컬렉션 ( IEnumerable<Foo> Foos { get; set; }
) 의 각 요소에 대해 프레임 워크에서 자동으로 렌더링 할 재사용 가능한 템플릿 을 정의합니다 .
@model Foo
<div>@Model.Bar</div>
읽기 전용으로 표시하는 것과 달리보기 모델을 편집 할 수있는 일부 입력 필드를 표시하려는 경우 사용해야하는 편집기 템플릿에 대해 정확히 동일한 규칙이 적용됩니다.
답변
사람들이 뷰에 로직을 넣지 않는다고 말할 때 그들은 일반적으로 로직을 렌더링하는 것이 아니라 비즈니스 로직을 참조합니다. 겸손한 의견으로는 뷰에서 @foreach를 사용하는 것이 완벽하다고 생각합니다.
답변
나는 사용하고있다 @foreach
엔터티 목록이 포함 된 엔터티를 보낼 때 하고 있습니다 (예 : 1 개의보기에 2 개의 그리드 표시).
예를 들어 내가 모델로 포함하는 엔티티 푸를 보낸다 경우 Foo1(List<Foo1>)
와Foo2(List<Foo2>)
다음과 같이 첫 번째 목록을 참조 할 수 있습니다.
@foreach (var item in Model.Foo.Foo1)
{
@Html.DisplayFor(modelItem=> item.fooName)
}
답변
면도기보기에서 foreach를 사용한 경우 @DarinDimitrov에 대한 답장.
<li><label for="category">Category</label>
<select id="category">
<option value="0">All</option>
@foreach(Category c in Model.Categories)
{
<option title="@c.Description" value="@c.CategoryID">@c.Name</option>
}
</select>
</li>
답변
템플릿을 나타 내기 위해 오버로드를 사용하면 대답 이 작동하지 않습니다 @Html.DisplayFor(x => x.Foos, "YourTemplateName)
.
그런 식으로 설계된 것 같습니다 . 이 사례를 참조하십시오 . 또한 프레임 워크가 제공하는 예외 (예상과 다른 유형에 대한)는 매우 오해의 소지가 있으며 첫 번째 시도에서 나를 속였습니다 (@CodeCaster에게 감사드립니다)
이 경우 당신은에있는 사용@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}