2013-04-16 1 views
1

자식 _DetailsViewModel의 인스턴스를 포함하는 OrderViewModel이 있습니다. OrderViewModel에는 주문 헤더 정보가 있고 _DetailsViewModel에는 주문 세부 정보가 있습니다. 별도의 모델 임에도 불구하고 둘 모두 동일한 단일 데이터 소스 인 Orders 테이블을 가지고 있습니다. 세부 사항이 자체 View Model에있는 이유는 동일한 시각적 배열로 해당 필드가 다른 View에서 재사용된다는 것입니다. 따라서 Partial View에 다시 배치하여 필요에 따라 재사용 할 수 있습니다. 내가 Orders 테이블에서 모든 데이터를 반환하고 주문 엔티티의 목록을 반환하는 서비스를 호출 내 컨트롤러 내에서MVC 4에서 하위 모델을로드하는 중 문제가 발생했습니다.

public class OrderViewModel 
{ 
    public string OrderNum { get; set; } 
    public string CustonerName{ get; set; } 
    public double SalesPrice{ get; set; } 
    public _Details Details { get; set; } 
} 

public class _DetailsViewModel 
{ 
    public string PhoneNum { get; set; } 
    public string ItemNum { get; set; } 
    public double Quantity { get; set; } 
    public string PayMethod{ get; set; } 
    public string Comments { get; set; } 
} 

: 여기 내 주와 자식보기 모델의 생각이다.

orderService = new OrderService(); 
var orders = orderService.GetOrderInfo(StoreNum); 

거기에서 Omu.ValueInjecter를 사용하여 결과를 기본 View Model에 주입합니다.

var orderViewModel = orders 
        .Select(x => new        
         OrderViewModel().InjectFrom(x)).Cast<OrderViewModel>() 
        .ToList(); 

return View(orderViewModel); 
나는 아래처럼 ... 내 주요 주문보기 내에서 부분보기에 전달할 수 있도록 나는 또한 _Details 모델을 채울 필요가

:

@ Html.Partial ("_ OrderDetails의를" Model._Details)

이미 주 주문 모델을 채우고있는 단일 서비스 호출에서 _Details 모델을 채우는 방법이 있습니까? 주 Order View에 _Details 속성을 추가 한 다음 Order 뷰를 반복하여 해당 _Details Model의 각 필드를 수동으로 설정해야합니까? 확실하게 나는 뭔가를 놓치고있다.

감사합니다 ...

답변

2

이동 당신은 단지 하나 개의 쿼리 요청을 발행하는 방식으로 먼저 데이터베이스에서 엔티티, :,

// apply any filter(s) needed here. 
var orderList = orders.ToList(); 

// then do injecting using the "cached" orders 
var orderViewModel = orderList 
    .Select(x => new OrderViewModel().InjectFrom(x)) 
    .Cast<OrderViewModel>() 
    .ToList(); 

// then inject into your details model 
var detailsModel = orderList 
    .Select(x => new _DetailsViewModel().InjectFrom(x)) 
    .Cast<_DetailsViewModel>() 
    .ToList(); 

그리고 작은 제안 내가 수도있는 경우를 위해 밑줄을 제거 _DetailsViewModel을 사용하여 명명 표준을 작성하십시오.

UPDATE :

가 어떻게 나중에 주문보기에 를 전달하는 orderViewModel에 detailsModel를 추가하는 방법은 무엇입니까?

당신은 단순히과 같이 OrderViewModel의 인스턴스로 설정 :

orderViewModel.Details = detailsModel ; 

그런 다음보기로 orderViewModel를 반환하고 거기에 당신의 일을 수행

@Html.Partial("_OrderDetails", Model.Details) 
+0

감사합니다. 나중에 orderViewModel에 detailsModel을 추가하여 Order View로 전달하려면 어떻게해야합니까? orderViewModel.Details = detailsModel ??? 또는 각 주문에 대한 세부 정보를 추가하려면 반복해야합니까? 몇 가지 샘플 코드를 보여 주면 크게 감사하겠습니다. – user2167861

+0

'OrderViewModel'의 속성은 다음과 같아야합니다 :'public _DetailsViewModel Details {get; 세트; }'? –

+0

예, 그렇습니다. 실제로 이것은 오타였습니다. 내 실제 코드에서 _DetailsViewModel로 설정됩니다. – user2167861