Asp.net mvc 如何在MVC中传递ViewBag以列表形式查看?

Asp.net mvc 如何在MVC中传递ViewBag以列表形式查看?,asp.net-mvc,Asp.net Mvc,我有两个表要在视图中显示 SalesDocument(单行) 交货计划(多行/列表) 我使用ViewBag传递要查看的值,代码如下: 控制器: public ActionResult Detail(string id) { ViewBag.SalesDocument = logisticsContext.Sap_Sales_Order_Report_qas .Where(x => x.sales_documen

我有两个表要在视图中显示

  • SalesDocument(单行)
  • 交货计划(多行/列表)
  • 我使用ViewBag传递要查看的值,代码如下:

    控制器:

    public ActionResult Detail(string id)
    {
            ViewBag.SalesDocument = logisticsContext.Sap_Sales_Order_Report_qas
                                    .Where(x => x.sales_document == id)
                                    .SingleOrDefault();
    
            var ExistingSchedule = sipContext.OrderDeliverySchedules
                                   .Where(o => o.so_no == id)
                                   .OrderBy(o => o.split_date)
                                   .ToList();
    
            ViewBag.DeliverySchedule = ExistingSchedule
                                       .Select(m => new
                                       {
                                           split_date = string.Format("{0:dd-MMM-yyyy}", m.split_date),
                                           m.split_hour,
                                           split_qty = string.Format("{0:N2}", m.split_qty),
                                           m.remarks
                                       }).ToList();
            return View();
    }
    
    @model Interisland.Areas.v2.Models.Logistics.Sap_Sales_Order_Report_qas
    @{
        ViewBag.Title = "Detail";
        var SalesDocument = (Interisland.Areas.v2.Models.Logistics.Sap_Sales_Order_Report_qas)ViewBag.SalesDocument;
    
        var DeliverySchedule = (List<Interisland.Areas.v2.Models.Sip.OrderDeliverySchedule>)ViewBag.DeliverySchedule;
    }
    
    查看:

    public ActionResult Detail(string id)
    {
            ViewBag.SalesDocument = logisticsContext.Sap_Sales_Order_Report_qas
                                    .Where(x => x.sales_document == id)
                                    .SingleOrDefault();
    
            var ExistingSchedule = sipContext.OrderDeliverySchedules
                                   .Where(o => o.so_no == id)
                                   .OrderBy(o => o.split_date)
                                   .ToList();
    
            ViewBag.DeliverySchedule = ExistingSchedule
                                       .Select(m => new
                                       {
                                           split_date = string.Format("{0:dd-MMM-yyyy}", m.split_date),
                                           m.split_hour,
                                           split_qty = string.Format("{0:N2}", m.split_qty),
                                           m.remarks
                                       }).ToList();
            return View();
    }
    
    @model Interisland.Areas.v2.Models.Logistics.Sap_Sales_Order_Report_qas
    @{
        ViewBag.Title = "Detail";
        var SalesDocument = (Interisland.Areas.v2.Models.Logistics.Sap_Sales_Order_Report_qas)ViewBag.SalesDocument;
    
        var DeliverySchedule = (List<Interisland.Areas.v2.Models.Sip.OrderDeliverySchedule>)ViewBag.DeliverySchedule;
    }
    
    @model Interisland.Areas.v2.Models.Logistics.Sap\u Sales\u Order\u Report\u qas
    @{
    ViewBag.Title=“详细信息”;
    var SalesDocument=(Interisland.Areas.v2.Models.Logistics.Sap_Sales_Order_Report_qas)ViewBag.SalesDocument;
    var DeliverySchedule=(列表)ViewBag.DeliverySchedule;
    }
    
    但是,当我试图在视图上显示它时,它返回了一个异常,表示:

    “无法将类型为”System.Collections.Generic.List
    1[f_uAnonymousType4
    4[System.String,System.TimeSpan,System.String,System.String]]的对象强制转换为”System.Collections.Generic.List`1

    这只发生在交货时间表上。 我试着调试它,值是正确的,但是在将其转换为视图中的列表时失败了。我的代码有什么问题吗


    非常感谢您提前提供的任何帮助

    您可以/应该使用customModel将数据从控制器传递到视图,而不是使用
    ViewBag

    public class YourCustomModel
    {        
        public Sap_Sales_Order_Report_qas SalesDocument { get; set; }
        public List<DeliverySchedule> DeliverySchedule { get; set; }
    }
    
    public class DeliverySchedule
    {
        public string split_date { get; set; }
        public string split_hour { get; set; }
        public string split_qty { get; set; }
        public string remarks { get; set; }
    }
    
    公共类自定义模型
    {        
    公共Sap_销售_订单_报告_qas销售文档{get;set;}
    公共列表交付时间表{get;set;}
    }
    公共类交付时间表
    {
    公共字符串拆分_日期{get;set;}
    公共字符串拆分时间{get;set;}
    公共字符串拆分\u数量{get;set;}
    公共字符串备注{get;set;}
    }
    
    查看

    @model Interisland.Areas.v2.Models.Logistics.YourCustomModel
    @{        
        Sap_Sales_Order_Report_qas SalesDocument = Model.SalesDocument;    
        List<DeliverySchedule> DeliverySchedule = Model.DeliverySchedule;
    }
    
    @model Interisland.Areas.v2.Models.Logistics.YourCustomModel
    @{        
    Sap_Sales_Order_Report_qas SalesDocument=Model.SalesDocument;
    List DeliverySchedule=Model.DeliverySchedule;
    }
    
    您可以/应该使用customModel将数据从控制器传递到视图,而不是使用
    ViewBag

    public class YourCustomModel
    {        
        public Sap_Sales_Order_Report_qas SalesDocument { get; set; }
        public List<DeliverySchedule> DeliverySchedule { get; set; }
    }
    
    public class DeliverySchedule
    {
        public string split_date { get; set; }
        public string split_hour { get; set; }
        public string split_qty { get; set; }
        public string remarks { get; set; }
    }
    
    公共类自定义模型
    {        
    公共Sap_销售_订单_报告_qas销售文档{get;set;}
    公共列表交付时间表{get;set;}
    }
    公共类交付时间表
    {
    公共字符串拆分_日期{get;set;}
    公共字符串拆分时间{get;set;}
    公共字符串拆分\u数量{get;set;}
    公共字符串备注{get;set;}
    }
    
    查看

    @model Interisland.Areas.v2.Models.Logistics.YourCustomModel
    @{        
        Sap_Sales_Order_Report_qas SalesDocument = Model.SalesDocument;    
        List<DeliverySchedule> DeliverySchedule = Model.DeliverySchedule;
    }
    
    @model Interisland.Areas.v2.Models.Logistics.YourCustomModel
    @{        
    Sap_Sales_Order_Report_qas SalesDocument=Model.SalesDocument;
    List DeliverySchedule=Model.DeliverySchedule;
    }
    
    这一行显然抛出了
    InvalidCastException
    ,因为您试图将匿名类型从查询结果强制转换为
    OrderDeliverySchedule

    var DeliverySchedule = (List<Interisland.Areas.v2.Models.Sip.OrderDeliverySchedule>)ViewBag.DeliverySchedule;
    
    查看

    @model ViewModel
    
    @{
        var DeliverySchedule = Model.DeliverySchedule;
    }
    

    作为旁注,应避免使用
    ViewBag
    传递集合,因为
    ViewBag
    内容是在运行时解析的,并且需要额外的强制转换才能获得正确类型的内容,请改用强类型viewmodel属性。

    这一行显然抛出了
    InvalidCastException
    ,因为您试图将匿名类型从查询结果强制转换为
    OrderDeliverySchedule

    var DeliverySchedule = (List<Interisland.Areas.v2.Models.Sip.OrderDeliverySchedule>)ViewBag.DeliverySchedule;
    
    查看

    @model ViewModel
    
    @{
        var DeliverySchedule = Model.DeliverySchedule;
    }
    

    作为旁注,应避免使用
    ViewBag
    传递集合,因为
    ViewBag
    内容在运行时解析,并且需要额外的强制转换才能获得具有适当类型的内容,请改用强类型viewmodel属性。

    您正在创建匿名对象的集合。您需要创建一个模型并将查询到的项目投影到该模型的集合-
    但无论如何,您不应该使用
    ViewBag
    。创建一个包含所有所需数据的视图模型,并返回该视图模型的实例。您正在创建一个匿名对象的集合。您需要创建一个模型,并将查询投影到该模型的集合-
    。选择(m=>new OrderDeliverySchedule{…}
    但无论如何都不应使用
    ViewBag
    。创建一个包含所有所需数据的视图模型,并返回该视图模型的实例