2012-10-28 3 views
0

내보기 모델은 다음과 같이 보입니다 나의 목표이다를 사용하여 단일 뷰 모델은

public class Car() { 
    public string Make { get; set; } 
    public string Model { get; set; } 
    . . . 
} 

단 하나의 뷰 모델을 가지고 그 내 목록보기와 단일보기 모두에 사용할 수 있습니다. 목록보기의 경우, Car 목록을 수화하여보기 내에서 사용하고 단일 Car 엔터티는 무시합니다.

자세한 내용은 반대입니다. 내 컨트롤러가 단일 Car 엔티티를 수화 시키면 뷰는이를 사용하고 목록을 무시합니다.

이것은 부분적으로 작동하지만 모델 바인딩이 약합니다.

DRY (반복하지 말 것)와 SOC/SRP (우려 사항 분리/단일 책임 원칙)가 여기에 상충되는 것 같습니다. 목록보기와 상세보기를 모두 처리하는 가장 좋은 방법은 무엇입니까? 대답은 중복 된 뷰 모델을 만드는 것입니다.하지만 도움이 될만한 코드를 복제하고 싶지는 않습니다.

답변

2

조금 생각한 것 같습니다. 간단하게 같을 것이다 CarViewModel라는 하나 개의 클래스가 : 당신의 상세보기/편집을 위해

public class CarViewModel() { 
    public string Make { get; set; } 
    public string Model { get; set; } 
    . . . 
} 

을/뷰를 생성,보기 유형 CarViewModel이 될 것입니다. 목록보기의 경우 CarViewModel 목록을보기에 전달하면됩니다. 목록보기에서 모델 유형을 IEnumerable<CarViewModel>()으로 지정하십시오. 이렇게하면 현재 제안 된 경로에서 클래스가 제거되고 단일 View Model이 Car 관련 모든 것을 담당하게됩니다.

편집

우려입니다 - "내 목록보기 모델은 자동차 단지리스트보다 더 많은 정보를 필요로 어떤 경우에". 이 경우 추가 정보가 필요하므로 목록보기에 대한 독립 실행 형보기 모델을 만드는 것이 좋습니다.

public class ListOfCarsViewModel(){ 
    public IEnumerable<CarViewModel> Cars {get;set;} 
    public string SomeOtherProperty {get;set;} 
    public bool SomeFlagProperty {get;set;} 
} 

우리는 여전히 자동차 목록을보기에 전달하므로 우리는 반복하지 않습니다. 그러나 자동차 목록보다 많은 것을 필요로하기 때문에이보기 모델은 단순한 목록보다 많은 속성을 가져야합니다. 코드/뷰에 해당 정보가 필요한 경우 다중 뷰 모델을 갖는 데는 아무런 문제가 없습니다.

+0

내 원래 구현 당신이 제안처럼입니다

public class Car() { public string Make { get; set; } public string Model { get; set; } . . . } 과 모델 클래스. 내 유일한 관심사는 목록보기는 궁극적으로 단순히 개체 목록 이외의 추가 정보가 필요할 수 있습니다. –

+0

그런 다음이를 고려한 목록보기에 대한 두 번째보기 모델을 만들 수 있습니다. 예제에서 편집하겠습니다. – Tommy

0

또한 약간이 메인 모델처럼 기본 클래스를 상속 할 수는

public class CarViewModel:Car { public List<CarModel> Cars { get; set; } }