2012-07-24 2 views
1

표준 WebForms에는 몇 가지 속성이 있고 그 속성을 설정했습니다. 그런 다음 웹 페이지를 바인드합니다 (예 : <%#CustomerName%>).면도기에서 뷰의 데이터에 어떻게 액세스합니까?

나는 MVC는 다른 접근 방식이라고 이해하지만, 여전히 동시에 여러 소스의 데이터를 표시하기위한 기본적인 필요가 있어야합니다.

내가 @Model를 사용하는 경우 다음 컨트롤러에서 설정 한 데이터에 액세스하는 것을 볼 수 있습니다. 그러나 2 개 또는 3 개의 개별 항목의 데이터를 표시하려면 어떻게해야합니까?

내가 같은 페이지에 Customer, 자신의 주소와 자신의 현재 주문을 모두 표시 할 경우, 하나 개의보기에이 세 별도의 모델을 전달하는 방법이, 또는 내가이를 만들어야합니다 경우입니다 각각에 대한 부분보기를 한 다음 모두 같은 페이지에 표시 할 수 있습니까? 당신은 어떻게 할 것인지

답변

4

는 속성으로 모든 데이터 (클래스)를 보유하고보기에 그것을 돌려 ViewModel을 가지고

public class CustomerViewModel 
{ 
    public int ID { set;get;} 
    public string Name { set;get;} 
    public Address Address{ set;get;} 
    public IEnumerable<Order> Orders { set;get;} 

    public CustomerViewModel() 
    { 
    if(Address==null) 
     Address=new Addres(); 
    if(Orders ==null) 
     Orders =new List<Order>(); 

    } 
} 
public class Address 
{ 
    public string AddressLine1 { set;get;} 
    //Other properties 
} 
public class Order 
{ 
    public int ORderID { set;get;} 
    //Other properties 
} 

하여 GET 작업 방법

public ActionResult Index(int id) 
{ 
    var vm=new CustomerViewModel(); 

    vm.Name=repo.GetUser(id).Name; 

    vm.Address=repo.GetAddressFromUserID(id); 

    vm.Orders=repo.GetOrdersFromUser(id); 

    return View(vm); 
} 

그리고 당신의보기 강하게 CustomerViewModel

TP 입력됩니다
@model CustomerViewModel 

<p>@Model.Name</p> 
<p>@Model.Address.AddressLine1</> 
@foreach(var item in Model.Orders) 
{ 
    <p>@item.OrderID</p> 
} 
+0

당신과 조지는 같은 해결책과 동일한 표를 가지고 있지만, 처음에는 고마웠습니다. – Matt

+0

@Matt 그건 중요하지 않지만, 타임 스탬프 위로 마우스를 가져 가라. (이 글을 쓰면서, 어제 : 나는 수주보다 42 초 빠름). –

0

세 고객 모델을 포함하여 Model의 컬렉션을 만들 수 있습니다. MVC에서 모델에 대해 이야기 할 때는 ViewModels으로 생각하면 도움이됩니다. 즉, 해당 뷰에 대한 모든 데이터를 포함 할 뷰 당 하나의 모델을 말합니다. 그래서 예를 들어 당신이보기 모델에 대한 속성으로 설정 한 데이터 모델에서 고객의 컬렉션이 아래

. 이제보기 (또는 HTML 도우미 확장 방법)

public class MyViewModel{ 
    private List<Customer> _customers; 

    public List<Customer> Customers{ 
     get{ 
      return _customers; 
     } 
    } 
    //Other View Model Properties and Methods 
} 
4

이 항목이 관련되어있는 경우는 @Model.Customers을 반복 할 수 있습니까? 보기에서 다음

public CustomerViewModel 
{ 
    public Customer Customer {get; set; 
    public AddressViewModel Address {get; set;} 
    public OrderViewModel Order {get; set;} 
} 

: 이러한 경우에는 다음 각 모델의 집합체 인 ViewModel을 만드는 것이 좋습니다 항목이있는 경우,

@inherits System.Web.Mvc.WebViewPage<CustomerViewModel> 

@model CustomerViewModel 

@Model.Customer.Name 

@Model.Address.Street 

@Model.Order.Name 

@model.Order.Date 

그렇지 않으면를 한 후, 전혀 관련 하지 당신이 사용할 수있는 RenderAction :

당신의 Customer보기에서 :

@Model.Customer.Name 

@(Html.RenderAction("GetAddress", "Customer", new { customerId = Model.Customer.Id });) 

@(Html.RenderAction("GetOrders", "Order", new { customerId = Model.Customer.Id });) 
+0

그래서 GetAddress 및 GetOrders가 컨트롤러의 속성이라고 가정합니다. – Matt

+0

@Matt RenderAction을 호출하는 경우 컨트롤러에서 액션을 수행해야합니다 (즉, 실제로 별개의 항목 인 경우 - 순서가 있어야하지만 주소에 대해서는 확실하지 않습니다.) 오히려 ViewModel의 Address 부분을 만들고'RenderAction'을 통해 별도로 주문을 렌더링하십시오. –

+0

Ok, 수정 및 후속 조치에 대해 감사드립니다. – Matt

관련 문제