Asp.net mvc ASP MVC,具有单个控制器的多个模型/具有EF的视图
有人能给我解释一下如何在一个视图中使用多个模型,其中每个模型表示一个DB表吗 我目前所做的是为每个模型创建一个模型文件 示例模型:Asp.net mvc ASP MVC,具有单个控制器的多个模型/具有EF的视图,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,有人能给我解释一下如何在一个视图中使用多个模型,其中每个模型表示一个DB表吗 我目前所做的是为每个模型创建一个模型文件 示例模型: [Table("Order")] public class OrderModel { [Key, Column(Order = 0)] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int OrderID { get; set; } [Ke
[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; }
}
编辑
或者,如果将视图强键入到列表而不是单个实例,则可以执行类似的操作:
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);
}
public ActionResult PlaceOrder()
{
var viewModel=新列表();
var模型=新的OrderPlacementModel
{
OrderChild=new OrderModel(),//或从数据源获取此对象
OrderItemsChild=新的OrderItemsChild(),
//…等等
};
添加(模型);
//无论需要发送到视图的实例有多少,都要使用泡沫、冲洗、重复。
返回视图(viewModel);
}
理想情况下,您应该为视图创建一个视图模型,该视图包含需要通过视图公开的每个模型的字段。然后可以在控制器中映射这些。我会让你的映射类完全不知道你的视图模型。保持视图独立于数据模型
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; }
}
这样做会给您的初始开发时间增加一点开销,但会给您带来更大的灵活性,因为您不必将所有视图都按实体类的形状进行建模。您能进一步阐述这个问题吗?“使用多个模型”是什么意思?这是否意味着显示、编辑等?好的,我遇到的问题是我遇到了以下错误:传入字典的模型项的类型为“Test2012.Models.OrderPlacementModel”,但此字典需要类型为“System.Collections.Generic.IEnumerable1[Test2012.Models.OrderPlacementModel]”的模型项。这是我的索引视图:
code`@model IEnumerable@{ViewBag.Title=“Index”}Index@foreach(模型中的var项){@item.MaterialsChild}@1tufgt编辑答案以解决您的评论OK,那么如果我的模型不是强类型IEnumerable,那么设置视图的正确方法是这样的,以便我可以从子模型中提取特定值吗code
@model Test2012.Models.OrderPlacementModel@{ViewBag.Title=“Index”}Index@{var materials=model.MaterialsChild.ToList();foreach(materials中的var项){@item.Name}如何迭代materials子项?它似乎不是一个IEnumerable。如果您查看材质模型code
public class OrderPlacementModel{public OrderModel OrderChild{get;set;}public OrderItemsModel OrderItemsChild{get;set;}public StatusModel StatusChild{get;set;}public List MaterialsChild{get;set;}public CategoryModel CategoryChild{get;set;}public PackModel PackChild{get;set;}}但是我最初使用模型来设置我的代码优先ef数据库,但是,用于映射数据库表的模型不应该是传递给视图的模型——您应该为此拥有专用的视图模型,并在控制器中将属性值从一个移动到另一个,就像我提供的代码中那样。
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; }
}
[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 */
}
}