2010-04-29 2 views
0

C# 4, ASP.NET MVC 2 및 NHibernate 컨텍스트에서; 다음과 같은 시나리오가 있습니다 :편집 뷰의 뷰 모델 속성의 다른 하위 세트 표시

ProductType에 연결되어있는 엔티티 Product을 가정 해 봅니다.

제품 편집보기에서; 제품 유형의 하위 집합 만 우아하고 건조한 방식으로 ProductType 연관을 기반으로 표시한다는 것을 어떻게 구현합니까? 즉, ProductType의 속성 값마다 다른 속성이 표시됩니다.

제품보기 모델 빌더를 사용하면 다른보기 모델에서보기가 자동으로 Html.EditorForModel() (보기 편한 항목이 아닌 드롭 다운 및 기타 항목 포함)으로보기를 생성합니까?

하나의 뷰 모델의 속성을 특성화하고 앞에서 설명한 Html.EditorForModel() 방법을 사용합니까?

하나의 모델을 사용하지만 다른 웹 컨트롤 (보기 전략)을 구현합니다 (DRY 할 수 있습니까?)?

완전히 다른가요?

답변

0

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Footprint.Web.ViewModels.ReportsEditViewModel>" %> 
<fieldset> 
    <legend>Summary Report Parameters</legend> 
    <div class="editor-label"> 
     <%= Html.LabelFor(model => model.Frequency)%> 
    </div> 
    <div class="editor-field"> 
     <%= Html.DropDownListFor(model => model.Frequency,Model.Frequencies) %> 
     <%= Html.ValidationMessageFor(model => model.Frequency)%> 
    </div> 
    <div class="editor-label"> 
    </div> 
    <div class="editor-field"> 
     <%= Html.CheckBoxFor(model => model.Combine) %><%= Html.LabelFor(model => model.Combine)%> 
    </div> 
</fieldset> 

HTH :

  <% switch (Model.ReportType) 
      { 
       case (int)ReportType.summary: 
        Html.RenderPartial("Edit/SummaryControl", Model); 
        break; 
       case (int)ReportType.exception: 
        Html.RenderPartial("Edit/ExceptionControl", Model); 
        break; 
       case (int)ReportType.leakdetection: 
        Html.RenderPartial("Edit/LeakDetectionControl", Model); 
        break; 
      } %> 

과 요약 부분 뷰를보고합니다. 나는 자동적으로 와 드롭 다운 및 기타 물건 되지 않은 등의 내 자신의 Html.EditorForModel() 를 (뷰를 생성하는 다른보기 모델 에서

제품보기 모델 빌더를 사용하고 같은 접근 방식을 갔다 상자 밖으로)?

본래의 질문입니다.

해당 도메인 모델 엔터티의 인스턴스뿐만 아니라 드롭 다운에 사용할 도메인 모델의 다른 목록을 사용하는보기 모델 작성자가 있습니다.

EditorFor/EditorForModel을 사용하지 않고 Brad Wilson의 아이디어 described in this post을 기반으로 맞춤 템플릿을 만들었습니다.

DRY, 간단하고 명시 적 (코드를 줄이기 위해 한 번 이상 동적 언어를 사용하기를 바랐지만 일부 반사 및 제거).

0

당신은 EditorForModel를 사용하고 속성을 추가하는 경우에만 속성의 부분 집합이 표시 얻을 수 있습니다 : 당신은 표시하지 않으려는 속성에

[ScaffoldColumn(false)] 

합니다. 물론 사용자 정의 편집기 템플릿을 구현하면 HTML이 렌더링되는 것을 완전히 제어 할 수 있습니다.

+0

속성 값에 따라 ScaffoldColumn을 true/false로 설정해야한다는 것을 어떻게 의미합니까? –

+0

죄송합니다. 명확하지 않은 경우 -이 속성은 기본 EditorFor 도우미와 함께 표시하지 않으려는 각 속성에 적용됩니다. false로 설정하면 해당 속성이 표시되지 않습니다. 그런 다음 데이터 주석을 사용하여 출력을 사용자 정의 할 수 있습니다. – Tejs

+0

나는 그것을 얻었다. 내 질문 (여전히) : (보기) 모델의 속성을 기반으로 렌더링 된 속성이 다른 편집보기에서 일부 속성을 렌더링하는 방법은 무엇입니까? ScaffoldColumn은 하나의 사례에 대한 정적 솔루션입니다. 권리? 속성이 구현되는 방식에서는 함수 호출을 매개 변수로 허용하지 않습니다 (상수 표현식이어야 함). 그렇지 않으면 [ScaffoldColumn (m => ShallShowSpec.IsSatisfiedBy (m))]과 같은 작업을하는 것이 좋을 것입니다. 여전히 문제가 해결되었다고 생각되면; 작동 코드를 제공하거나 나에게 다른 방법을 가르쳐주십시오. –

1

아 - 알겠습니다. 이는 기술적으로 지원되지 않습니다. 그러나 동일한 속성을 얻기 위해 펑키 리플렉션을 사용하기 위해 사용자 정의 속성을 변경할 수 있습니다. 그것은 확실히 좋은 방법은 아니지만.

또 다른 옵션은 Html.EditorFor (m => m.ProduceView())를 사용하는 것입니다. ProduceView는 속성의 상태에 따라 새로운 ViewModel 유형을 반환하는 메서드입니다. 따라서 일부 속성이 설정된 경우, ProduceView는 기본 클래스 또는 인터페이스를 구현하는 SetPropertyViewModel 또는 NotSetPropertyViewModel을 보냅니다. 그런 다음 각각의 뷰 모델에 다르게 주석을 달 수 있습니다.

+0

+1하십시오. 당신의 통찰력을 얻으려면 +1 –

0

ProductType을 매개 변수로 취하는 사용자 지정 DataAnnotationAttribute를 만듭니다. 그런 다음 볼 수있는 해당 속성에 적용하십시오. 추가 프로세스, 양식 요소 모양 및 느낌 또는 일부 양식 요소에 대한 JQuery를 처리 할 Product 용 EditorTemplate을 작성하여이 기능을 더욱 확장 할 수 있습니다.

1

첫 번째 단계는 뷰 모델을 만드는 것입니다. 이것이 실제 회사와 매우 유사하더라도, 분리가 중요합니다. 그래서 나는 ProductEditViewModel 클래스를 만들 것입니다.

다음으로 다른 제품 유형에 따라 변경 될 속성을 결정하십시오. 각 제품 유형에 대해 별도의 부분보기 모델을 작성하십시오. 이를 통해 표시되는 속성과 형식을 제어 할 수 있습니다.

기본 제품 편집보기에서 switch 문을 사용하여 필요에 따라 여러 부분보기를 "바꿔 넣거나 꺼내십시오". AJAX를 사용한다면, 이것을 동적으로 할 수 있습니다.

이 예에서는 다양한 보고서 유형을 가진 여러 보고서가 있습니다. 보고서의 주요 부분은 변경되지 않고 유형에 따라 여러 매개 변수 만 변경됩니다.

각 보고서 유형마다 별도의 부분보기가 있으며 보고서 유형에 따라 추가됩니다. 이 코드 스 니펫은 <% using (Html.BeginForm()) %> 코드 블록 안에 있습니다. 나는 모든 대답을 검토하고 더 철저를 통해 문제를 생각했습니다

+0

+1. –

관련 문제