2011-04-19 4 views
7

나는 같은 것을 할 필요가 : 나는 MVC3 나에게 새로운 면도칼보기 엔진을 사용하고MVC 면도기 뷰에서 코드를 반복하지 않도록 할 방법이 있습니까?

<div class="editor-field"> 
    @Html.EditorFor(model => model.A1) 
    @Html.ValidationMessageFor(model => model.A1) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.A2) 
    @Html.ValidationMessageFor(model => model.A2) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.A3) 
    @Html.ValidationMessageFor(model => model.A3) 
</div> 

. 내가하고 싶은 것은 A1, A2, A3, A4 ...와 같은 네 줄의 같은 블록을 반복해야하는 것을 피하는 것이다. 도우미, 템플릿 또는 다른 기능을 사용하여 여러 줄의 코드를 반복 할 필요가없는 방법이 있습니까?

답변

6

해당 클래스에 강력하게 입력 된 부분 뷰를 생성하십시오.

A_Partial.ascx는

<div class="editor-field"> 
    @Html.EditorFor(model) 
    @Html.ValidationMessageFor(model) 
</div> 

그런 다음 각 개체를 렌더링합니다.

@Html.Partial("A_Partial", model.A1) 
@Html.Partial("A_Partial", model.A2) 
@Html.Partial("A_Partial", model.A3) 
-1

가능하면 모든 배열을 하나의 배열/사전에 넣은 다음 foreach를 사용하십시오.

0

당신은 배열에 넣어 수 :

@foreach(var item in new object[] { Model.A1, Model.A2 /* ... */ }) { 
    <div class="editor-field"> 
     @Html.EditorFor(item) 
     @* ... *@ 
    </div> 
} 
11

하나의 옵션이 @Ufuk 언급 같은 부분 뷰를 사용하는 것입니다.

IMO는 MVC의 내장 규칙을 사용하여 편집기 템플릿을 사용하는 것이 가장 좋습니다.

A1, A2 등의 단일 속성 대신 IEnumerable<Something> Somethings에 입력하십시오.

그런 다음보기에서이 작업을 수행 :

@Html.EditorFor(model => model.Somethings)

그런 다음 Something.cshtml라는 편집기 템플릿을 생성하고 Shared\EditorTemplates에 배치하고, MVC는 각 루프에 대해 "암시"를 수행하고있는 어떤 밖으로 렌더링 모델에 대한 편집기 템플릿 :

<div class="editor-field"> 
    @Html.EditorForModel() 
    @Html.ValidationMessageForModel() 
</div> 

foreach는 루프를 사용하지 마십시오 - 불필요하고 피할 수있는 코드 수프입니다.

편집기 템플릿 HTML은 부분적이고 강력한 형식의 HTML과 동일합니다. 차이점은 파일을 찾기위한 규칙이지만 부분보기에는 명시적인 부분보기 이름이 필요합니다.

이것은 모델 유형을 변경하면 모델 유형을 기반으로 해당 템플릿을 검색하므로 MVC와 관련된 매우 강력한 규칙 기반 접근 방식을 사용할 수 있음을 의미합니다.

+1

+1 정말 좋은 대답은 다음 주에 할 일을 결정하는 데 도움이되었습니다. –

+0

@Rory - 기꺼이 도와 드리겠습니다. 나는 편집기/디스플레이 템플릿을 광범위하게 사용 해왔다. 열거 형을 렌더링하는 것과 같은 간단한 것들조차도. 에디터 템플릿을 생성함으로써, 나는 그 enum 타입에 바인드 된'EditorFor' 또는'DisplayFor'를 사용하는 모든 View가 그 템플릿을 사용할 수 있도록 할 수 있습니다. 아주 세다. 레이아웃을 위해 또는 템플릿이 모델 자체보다 더 많은 것을 필요로 할 때만 부분적으로 만 사용합니다. – RPM1984

관련 문제