뷰 내부에 @foreach가있는 것은 안된다고 들었습니다. 의미, 뷰에는 논리가 없어야합니다. @foreach에 대한 논리가 있어야하는 위치에 대한 모범 사례는 무엇입니까?
@foreach..
뷰 내부에 @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
HTML의 주위에 비트가 항상 거의 순간 일 것이다. 내가 말했듯이,하지만 큰 거래 중 하나의 방법은 아니지만, 어떤 경우 인수 거기 에 대한 사용 foreach
.
사람들이 뷰에 로직을 넣지 않는다고 말할 때 그들은 일반적으로 로직을 렌더링하는 것이 아니라 비즈니스 로직을 참조합니다. 겸손한 의견으로는 뷰에서 @foreach를 사용하는 것이 완벽하다고 생각합니다.
면도기보기에서 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.DropDownListFor
단순히 제목 만 고려 하는 재사용 가능한 사용자 지정 도우미를 작성하지 않겠습니까? 그것은 사소한 스파게티 코드로 뷰를 설정하지 않습니다 stackoverflow.com/a/7938038/29407
optgroup
HtmlHelpers에는 지원이 없기 때문에 선택 목록의 요소 를 렌더링하는 데 더 좋은 예가 될 수 있습니다 . 선택 목록에 추가 항목을 추가해야하는 경우이를 달성 한 다음 도우미를 계속 사용하는 더 좋은 방법이 있습니다.
템플릿을 나타 내기 위해 오버로드를 사용하면 대답 이 작동하지 않습니다 @Html.DisplayFor(x => x.Foos, "YourTemplateName)
.
그런 식으로 설계된 것 같습니다 . 이 사례를 참조하십시오 . 또한 프레임 워크가 제공하는 예외 (예상과 다른 유형에 대한)는 매우 오해의 소지가 있으며 첫 번째 시도에서 나를 속였습니다 (@CodeCaster에게 감사드립니다)
이 경우 당신은에있는 사용@foreach
@foreach (var item in Model.Foos)
{
@Html.DisplayFor(x => item, "FooTemplate")
}
IEnumerable<T>
유형에 T
대한 템플릿을 반복 하고 호출합니다 .