【问题标题】:How to pass ViewBag to View as a list in MVC?如何将 ViewBag 作为 MVC 中的列表传递给 View?
【发布时间】:2018-05-03 05:08:21
【问题描述】:

我想在视图中显示 2 个表格,

  1. 销售文档(单行)
  2. DeliverySchedule(多行/列表)

我使用 ViewBag 将值传递给 View,代码如下:

控制器:

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;
}

但是,当我尝试在视图上显示它时,它返回了一个异常:

'无法将'System.Collections.Generic.List1[&lt;&gt;f__AnonymousType44[System.String,System.TimeSpan,System.String,System.String]]'类型的对象转换为'System.Collections.Generic。列表`1

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

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

【问题讨论】:

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

标签: asp.net-mvc


【解决方案1】:

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

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

假设你声明了这个视图模型:

public class ViewModel
{
    // other properties

    public List<OrderDeliverySchedule> DeliverySchedule { get; set; }
}

public class OrderDeliverySchedule
{
    public string split_date { get; set; }
    public string split_hour { get; set; }
    public string split_qty { get; set; }
    public string remarks { get; set; }
}

那么您应该在查询结果中返回 viewmodel 类名,如下所示:

控制器

var model = new ViewModel();

// other stuff

model.DeliverySchedule = ExistingSchedule.Select(m => new OrderDeliverySchedule
                         {
                             split_date = string.Format("{0:dd-MMM-yyyy}", m.split_date),
                             split_hour = m.split_hour,
                             split_qty = string.Format("{0:N2}", m.split_qty),
                             remarks = m.remarks
                         }).ToList();

 return View(model);

查看

@model ViewModel

@{
    var DeliverySchedule = Model.DeliverySchedule;
}

附带说明,应避免使用ViewBag 传递集合,因为ViewBag 内容在运行时解析并且需要额外的强制转换才能获得正确类型的内容,请改用强类型视图模型属性。

【讨论】:

    【解决方案2】:

    除了使用ViewBag,您可以/应该使用customModel 将数据从控制器传递到这样的视图,

    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; }
    }
    

    查看

    @model Interisland.Areas.v2.Models.Logistics.YourCustomModel
    @{        
        Sap_Sales_Order_Report_qas SalesDocument = Model.SalesDocument;    
        List<DeliverySchedule> DeliverySchedule = Model.DeliverySchedule;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2012-05-13
      • 2021-09-08
      • 2011-03-13
      • 2013-05-09
      • 1970-01-01
      相关资源
      最近更新 更多