2009-02-08 6 views
14

보기에 무엇을 넣으시겠습니까? 당신이보기 모델을 구축하는 컨트롤러 로직에 넣어 무엇을 , 어떤 뷰에 넣어해야합니다ViewModel에 넣을 내용

쉽게 테스트를 위해 특별한 모델 바인더를 사용하는 방법에 대한 Scott Hanselman에서 최근 blog은 다음에 대해 생각하는 저를 했습니까? 내보기에 데이터를 전달하는 같은 방법을 사용하지만, 나는 그가이 나라 속성을 다루는 방법에 대한 확실하지 오전, 지금

var viewModel = new DinnerFormViewModel { 
    Dinner = dinner, 
    Countries = new SelectList(PhoneValidator.Countries, dinner.Country) 
}; 
return View(viewModel); 

: 그가하는 일은 이것이다. 당신은 양측을 논할 수 있습니다 : SelectList의 국가 목록을 래핑하면 데이터를 전달하기 위해 뷰 모델 DTO를 만드는 것과 마찬가지로 뷰의 데이터를 준비합니다. 한편, 드롭 다운 목록에 사용되는 데이터를 특별히 조작하는 것처럼 느껴지므로 컨트롤러에서보기로 데이터를 처리하는 방식이 제한됩니다. 보기와 컨트롤러 사이의 관심사를 구분하는 데 약간 회색 영역이 있다고 느낍니다. 실제로 갈 방법을 결정할 수 없습니다. 이에 대한 모범 사례가 있습니까?

추신 : 간단하게 유지하려면 기본 ASP.NET MVC 컨텍스트를 가정 해 봅시다. 기본적으로 프로젝트의 기본 상태입니다. 기본보기 엔진과 모든 재즈.

답변

13

MVC (적어도이 맛)에서는 컨트롤러의 책임 중 하나가 뷰의 데이터를 준비하는 것입니다. 따라서 뷰 소비에 대한 특정 모델을 준비하는 것이 드롭 다운에서 사용된다는 것을 의미하는 것은 완전히 수용 가능하다고 생각합니다. 이 경우 컨트롤러는보기를 더 쉽게 만들고 실제로보기에는 어색한 코드가 눈에 띄지 않게해야합니다. 또한 VieData [ "Countries"]와 같은 ViewData에서 이러한 마술 문자열을 유지합니다.

책임의 관점에서 회색 영역이있는 것처럼 보일 수도 있지만 궁극적으로 컨트롤러의 역할 :보기와 상호 작용하고 도메인 모델을 다른 모델로 쉽게 변환 할 수 있습니다. 견해에 의해 소비.

+0

네, 맞아요. 보기에 국가 목록의 다른 표현이 필요하면 기본적으로 다른보기 DTO를 만들 것입니다. 맞습니까? 아마도 –

+0

. SelectList는 아마 체크 박스 등의 목록과 같은 다른 UI 구성 요소로 나타낼 수 있습니다. 어쩌면 다른 HTML 도우미 메서드가 여전히 SelectList를 사용하여 다른 것을 출력 할 수 있습니다. –

+0

+1 이런 식으로보기 모델을 사용하면 뷰에서 더 많은 논리가 제거되므로 항상 바람직합니다. –

7

보기마다 하나의 포괄적 인보기 모델을 갖는 것이 이상적이라고 제안하는 사람도 있습니다 (Thunderdome Principle).

관련 문제