有人可以向我解释如何使用单个视图的多个模型,其中每个模型代表一个数据库表吗?
我目前所做的是为每个模型创建一个模型文件。
示例模型:
[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; }
}
答案 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 */
}
}
以这种方式做事会为您的初始开发时间增加一些开销,但允许您更灵活,因为您不必将所有视图塑造成实体类的形状。