[asp.net-mvc] MVC 면도기 @foreach

뷰 내부에 @foreach가있는 것은 안된다고 들었습니다. 의미, 뷰에는 논리가 없어야합니다. @foreach에 대한 논리가 있어야하는 위치에 대한 모범 사례는 무엇입니까?

    @foreach..



답변

@foreach에 대한 논리가 있어야하는 위치에 대한 모범 사례는 무엇입니까?

아무데도 그냥 제거하십시오. 편집기 또는 디스플레이 템플릿을 사용할 수 있습니다.

예를 들면 다음과 같습니다.

@foreach (var item in Model.Foos)
{
    <div>@item.Bar</div>
}

디스플레이 템플릿으로 완벽하게 대체 할 수 있습니다.

@Html.DisplayFor(x => x.Foos)

그런 다음 해당 디스플레이 템플릿을 정의합니다 ( 기본 템플릿이 마음에 들지 않는 경우 ). 따라서 ~/Views/Shared/DisplayTemplates/Foo.cshtmlFoos 컬렉션 ( 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")
}


답변