2012-07-24 45 views
1

在標準的WebForms中,我會有一些屬性,並設置它們。然後網頁將綁定到他們,例如<%#CustomerName%>如何訪問Razor視圖中的數據?

我明白,MVC是一種不同的方法,但仍然必須同時顯示來自多個來源的數據的基本需求。

我可以看到,如果我使用@Model那麼它將訪問控制器中的數據集。但是如果你想顯示來自2個或3個獨立項目的數據呢?

如果我想顯示一個Customer,他們的地址和他們的當前順序都在同一頁上,有沒有辦法將這3個獨立的模型傳遞給一個視圖,或者是我需要創建一個視圖每個部分視圖,然後將它們全部顯示在同一頁面上?

回答

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); 
} 

而且你的視野將強類型TP CustomerViewModel

@model CustomerViewModel 

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

你和喬治都有同樣的解決方案和相同的投票,但你是第一個我認爲,謝謝。 – Matt 2012-07-25 18:13:02

+0

@Matt它並不重要,但如果你懸停在時間戳上(截至本文,「昨天」:我比Shyju快了42秒)。 – 2012-07-25 18:30:15

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;} 
} 

然後在您的視圖:

@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 2012-07-25 18:10:48

+0

@Matt如果你調用'RenderAction',他們應該是控制器中的動作(也就是說,如果他們真的是獨立的東西 - 訂單應該是,但我不太確定地址。而是使ViewModel的地址部分,並通過RenderAction單獨渲染訂單。 – 2012-07-25 18:28:57

+0

好的,感謝您的更正和跟進:) – Matt 2012-07-26 06:52:00