1

在标准的 WebForms 中,我会拥有一些属性并设置它们。然后网页将绑定到它们,例如使用<%#CustomerName%>.

我知道 MVC 是一种不同的方法,但仍然必须同时显示来自多个来源的数据的基本需求。

我可以看到,如果我使用@Modelthen 它将访问控制器中的数据集。但是,如果您想显示来自 2 或 3 个单独项目的数据怎么办?

如果我想Customer在同一页面上显示 a ,他们的地址和他们的当前订单,有没有办法将这 3 个单独的模型传递给一个视图,或者我需要为每个视图创建一个局部视图,然后将它们全部显示在同一页面上?

4

3 回答 3

4

物品有关系吗?如果是,则考虑创建一个 ViewModel,它是每个模型的聚合:

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 });)
于 2012-07-24T17:10:07.683 回答
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);
}

你的 View 将是强类型的 tpCustomerViewModel

@model CustomerViewModel

<p>@Model.Name</p>
<p>@Model.Address.AddressLine1</>
@foreach(var item in Model.Orders)
{
  <p>@item.OrderID</p>
}
于 2012-07-24T17:10:49.953 回答
0

您要做的是在您的上创建一个Model包含三个客户模型的集合。当我们谈论 MVC 中的模型时,将它们视为ViewModels. 也就是说,每个视图一个模型,它将包含该视图的所有数据。

因此,在下面的示例中,您将数据模型中的客户集合设置为视图模型的属性。您现在可以在您的视图中迭代@Model.Customers(或在 Html 辅助扩展方法中)

例子

public class MyViewModel{
    private List<Customer> _customers;

    public List<Customer> Customers{
        get{
            return _customers;
        }
    }
    //Other View Model Properties and Methods
}
于 2012-07-24T17:09:35.007 回答