ASP MVC,具有EF的单控制器/视图的多个模型

时间:2013-02-04 18:55:03

标签: asp.net-mvc entity-framework

有人可以向我解释如何使用单个视图的多个模型,其中每个模型代表一个数据库表吗?

我目前所做的是为每个模型创建一个模型文件。

示例模型:

[Table("Order")]
public class OrderModel
{
    [Key, Column(Order = 0)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int OrderID { get; set; }

    [Key, Column(Order = 1)]
    public int UserID { get; set; }
    public UserProfile Account { get; set; }

    public DateTime Date { get; set; }
    public int ShipLocation { get; set; }
    public string PONumber { get; set; }

    public int StatusID { get; set; }
    public StatusModel Status { get; set; }
}

这是包含在单个控制器/视图中使用的所有模型的另一个模型。

public class OrderPlacementModel
{
    public OrderModel OrderChild { get; set; }
    public OrderItemsModel OrderItemsChild { get; set; }
    public StatusModel StatusChild { get; set; }
    public MaterialsModel MaterialsChild { get; set; }
    public CategoryModel CategoryChild { get; set; }
    public PackModel PackChild { get; set; }
}

2 个答案:

答案 0 :(得分:1)

public ActionResult PlaceOrder()
{
  var viewModel = new OrderPlacementModel
  {
    OrderChild = new OrderModel(),//or fetch this object from your data source
    OrderItemsChild = new OrderItemsChild(),
    //...etcetera
  };
  return View(viewModel);
}

修改

或者,如果您强烈地将视图键入List<OrderPlacementModel>而不是单个实例,则可以执行与此类似的操作:

public ActionResult PlaceOrder()
    {
      var viewModel = new List<OrderPlacementModel>();
      var model = new OrderPlacementModel
      {
        OrderChild = new OrderModel(),//or fetch this object from your data source
        OrderItemsChild = new OrderItemsChild(),
        //...etcetera
      };
      viewModel.Add(model);
      //lather, rinse, repeat for however many instances you need to send to your view.
      return View(viewModel);
    }

答案 1 :(得分:0)

理想情况下,您应为视图创建视图模型,该视图包含您需要通过视图公开的每个模型的字段。然后,您可以在控制器中映射这些。我会让你的映射类完全不知道你的视图模型。保持您的观点独立于您的数据模型。

public class OrderViewModel
{
    public int OrderId { get; set; }
    public int UserId { get; set; }
    public DateTime Date { get; set; }
    public int ShippingLocation { get; set; }

    public List<ItemViewModel> Items { get; set; }
}

public class ItemViewModel
{
    public int ItemId { get; set; }
    public int Title { get; set; }
}

请注意我是如何为订单创建视图模型的,以及 - 允许订单包含多个项目 - 将这些项目分成单独的模型类。现在,您可以将视图输入OrderViewModel,并根据需要使用ItemViewModel的多个实例。

然后,您可以将视图模型映射到控制器中的数据库实体:

[HttpPost]
public ActionResult ConfirmOrder (OrderViewModel model)
{
    if (ModelState.IsValid)
    {
        foreach (ItemViewModel item in model.Items)
        {
            /* Create instance of OrderItemsModel (or whatever your
            DB mapping class is), populate with appropriate data
            from 'item' and commit to database. */
        }

        OrderModel order = new OrderModel();
        order.OrderId = model.OrderId;
        order.UserId = model.UserId;
        order.Date = model.Date;
        order.ShipLocation = model.ShippingLocation;

        /* TODO: Commit new order to database */

    }
}

以这种方式做事会为您的初始开发时间增加一些开销,但允许您更灵活,因为您不必将所有视图塑造成实体类的形状。