Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP MVC,具有单个控制器的多个模型/具有EF的视图_Asp.net Mvc_Entity Framework - Fatal编程技术网

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

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

有人能给我解释一下如何在一个视图中使用多个模型,其中每个模型表示一个DB表吗

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

示例模型:

[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.IEnumerable
1[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 */

    }
}