2011-02-23 4 views
1

이 아마 기본적인 것들이지만, 난 아무데도 명확한 답변을 찾을 수없는 ..뷰에 일대 다 데이터를 사용하려면 ViewModel이 필요합니까?

내가 엔티티 프레임 워크 (EF4)와 함께 MVC (3) 응용 프로그램을하고 있어요 말할 수 있습니다, 나는이 세 가지 클래스가 있습니다 :

public class Foo 
{ 
    public int FooID 
    public Bar Bar 
    public ICollection<Baz> Bazes 
} 

public class Bar 
{ 
    public int BarID 
    public string BarText 
} 

public class Baz 
{ 
    public int BazID 
    public Foo Foo 
} 

은 무엇 복용하는 가장 좋은 방법이 될 수있는 모든 푸의와 관련 바의 바즈의 I는 관련 항목의 푸의를 통해 루프하고 사용을 할 수 있도록? ViewModel을 만들어야하나요?

는 내가 함께 결국 원하는 것은 당신이 특히보기 모델이 필요하지 않습니다

@model = IEnumerable<Foo/FooViewModel> 

foreach(var foo in model) 
{ 
    @if(foo.Bar.BarID == 1) 
    { 
    foreach(var baz in foo) 
    { 
     @baz.BazID 
    } 
    } 
} 
+0

당신이보고 귀하의 의견을 싶습니다 방법에 대한 자세한 정보를 제공 할 수 :

public class FooView{ public BarView Bar { get; set;} public ICollection<BazView> Bazes { get; set;} } public class BarView{ public int BarID { get; set; } public BazView Baz { get; set; } } public class BazView { public int BazID { get; set; } } 

귀하의 액션 메소드는이 같은 뭔가를 할 것이다 처럼. 이것은 잠재적으로 순환하는 객체 계층 구조입니다. –

+0

확인. 질문이 업데이트되었습니다. 더 명확 해지기를 바랍니다. :) –

답변

2

같은 것입니다. EF 개체를보기로 직접 전달할 수 있으며 간단한 CRUD의 경우에는 문제가 없습니다. 제 경험으로는 결코 단순한 CRUD가 아니 었습니다.

일반적으로 하나의 개체에 모두 포함되어 있지 않은 여러 위치에서 데이터를 가져와야합니다. 예를 들어, 시스템의 사용자 역할에 따라 데이터를 표시하거나 숨기려고 할 수 있습니다. Foo는 아마 그것을 알지 못할 것입니다. 또 다른 예는 드롭 다운 목록이있는 양식입니다. 그 정보를 어딘가에 전달해야합니다. 다시 말하지만 foo는 옵션이 무엇인지 알지 못할 것입니다.

각 클래스에 대한보기 모델을 만든 다음 AutoMapper를 사용하여 도메인 모델을보기 모델에 매핑합니다.

로보기 모델은 다음과 같을 것이다 :

var foos = fooRepository.GetFoos(); 
var model = Mapper.Map<IEnumerable<Foo>,IEnumerable<FooView>>(myFoos); 
return View(model); 
+1

답변 주셔서 감사합니다. 이것에 대한 모델링이 내가 기대했던 것보다 조금 더 커 보인다. 그러나 그것은 유효 해 보인다! MVC를 더 많이 볼수록 MVVMC처럼 보이지만 모델 뷰 및 컨트롤러 만 있으면 누구나 얻을 수 있습니까? 다시 한 번 감사드립니다 –

+0

@ Niclas Lindqvist 당신은 당신의 EF 모델을 사용할 수 있습니다. 이것은 일반적으로 간단한 CRUD 응용 프로그램에 적합합니다. 제 경험으로는 절대로 크래드가 끝나지 않습니다. 내 대답을 편집하고 왜 뷰 모델을 사용하는지 자세히 설명했습니다. HTH –

+0

@Brian, 네 말이 맞아, 결코 CRUD가 아닐세. 나는 automapping에 그 모든 것을 조금 더 읽을 것이지만 모든 도움을 주셔서 감사합니다. –