2013-10-22 2 views
3

MVC에서 더 많은 ViewModels 및 강력한 형식의 뷰를 이해하고 싶습니다.MVC의 ViewModels 및 객체 조작

컨트롤러뷰 모델은

public class Combined 
    { 
     public IEnumerable<Domain> Domains { get; set; } 
     public IEnumerable<RegInfo> RegInfos { get; set; } 

     public Combined(IEnumerable<Domain> domains, IEnumerable<RegInfo> reginfos) 
     { 
      this.Domains = domains; 
      this.RegInfos = reginfos; 
     } 

I 결합 타입의 객체 저장소에서 데이터를 전달한다. (면도기 사용) 내가 @model 그래서 난 두 목록을 유지하는 개체를 전달하고있어 project.namespace.Combined이 뷰에서

public ActionResult RegDetails(int id = 0) 
     { 
      var domain = from x in unitofwork.DomainRepository.Get(n => n.ID == id) 
         select x; 

      var reginfo = from y in unitofwork.ReginfoRepository.Get(n => n.ID == id) 
          select y; 

      var regdetails = new Combined(domain, reginfo); 

      return View(regdetails); 
     } 

.

1/왜 @ Model.Domain.Name (noobish 질문이지만 그 뒤에 논리를 이해하는 데 도움이) 같은 각 목록 항목에 액세스 할 수 있습니까? 조인을 사용하여 View "level"형식으로 할 수 있지만 MVC 패턴을 완전히 반대합니다. 그 두 테이블을 조인 할 수있는 유일한 장소는 컨트롤러에 있다고 생각하지만, 완전히 새로운 객체를 생성 할 것이므로 모델을 생성해야합니까?

2/View (join, automapper)를 채우는 데 사용할 수있는 둘 이상의 테이블에서 데이터를 보유 할 IEnumerable 객체를 얻는 가장 좋은 방법은 무엇입니까?

3/하나의 양식에서 여러 테이블에 POST 할 때 사용할 수있는 모델을 만들 수있는 방법이 있습니까?

미리 감사드립니다.

+1

이 많은 로직 컨트롤러에서 진행에 조금처럼 보인다 , 왜보기 모델은 주어진 id로부터 스스로를 구성 할 수 없습니까? linq 질의는 크게 단순화 될 수 있으며'from x in' 또는'select x' 비트가 필요 없으며 직선의'Get'은 필요한 열거 형을 반환합니다. – asawyer

+0

ViewModel이라는 단어를 사용하는 것은 다소 혼란 스럽습니다. MVVM에서는 Model 객체를 표시하는보기에 맞게 변형 된 클래스를 나타내는 데 사용됩니다. – flup

답변

5

컨트롤러 동작에서 엔티티를 가져 오는 논리가 좋습니다. 그것이 컨트롤러의 일입니다. 그러나 뷰 모델에 사용자 정의 생성자가 필요하지 않습니다. 객체 초기화 만 사용하십시오. 보기 모델이 간다까지로 이제

var regdetails = new Combined { Domains = domain, RegInfos = reginfo } 

, DomainsRegInfosIEnumerable의,하지만 당신은 각각 하나의 객체를 가져 오는 것입니다. 목록 형식을 사용하려는 경우 LINQ를 수정하여 여러 항목을 선택해야하지만 실제로 각 항목에 대해 하나의 개체 만 포함되도록하려면보기 모델에 IEnumerable을 사용하지 않아야합니다.당신이 그렇게한다면

public class Combined 
{ 
    public Domain Domain { get; set; } 
    public RegInfo RegInfo { get; set; } 
} 

, 당신은 단지 @Model.Domain.Name으로 Domain 인스턴스에서 Name 속성에 액세스 할 수 있습니다. 당신이 그 (것)들에게리스트 형식을 유지하는 경우, 당신은 당신의보기에서 그들을 통해 루프 (경우에도 목록에서 하나의 항목 만있다)해야합니다

@foreach (var domain in Model.Domains) 
{ 
    // Do something with domain.Name 
} 
2

실제로보기에서 Model 속성을 얻을 수 있으며 C#에서와 같이 Domains 및 RegInfos 속성을 사용할 수 있습니다.

@{ 
    var firstDomain = Model.Domains.FirstOrDefault(); 
    // do some process with this variable 
} 

또는 : 예를 들어

@foreach(var regInfo in Model.RegInfos) 
{ 
    // do some other process   
} 

표시되는 데이터는 다양한 데이터 소스에서 온다면, 그것은 특정 뷰 모델을 만드는 것이 가장 좋습니다. 계산을하거나 비즈니스 규칙을 적용하지 않아야합니다. 데이터는 미리 서식을 지정해야합니다. 또 다른 이점은보기에 필요한 데이터 만 전달하는 것입니다. 표시된 속성 2 개에 대해서만 데이터베이스에서 거대한 개체 (또는 컬렉션)를 가져 오지 않으려는 것입니다.

해당보기 모델은 양식을 제출할 때도 사용할 수 있습니다. 포스트 작업에 뷰 모델 유형의 매개 변수가 있고 Html.Editor (For)와 같은 일부 HtmlHelper를 사용하여 뷰에서 입력을 올바르게 생성하는 경우 다시 가져올 수 있습니다.

어쨌든 강력한 형식의보기에 대해 많은 이야기가 있지만 웹 전체에서 많은 리소스/자습서를 볼 수 있습니다.