Как передать ViewBag для просмотра в виде списка в MVC? - PullRequest
0 голосов
/ 03 мая 2018

У меня есть 2 таблицы, которые я хочу отобразить в представлении,

  1. SalesDocument (одна строка)
  2. DeliverySchedule (несколько строк / список)

Я передаю значения View, используя 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;
}

Однако, когда я пытаюсь отобразить его в представлении, возвращается исключение:

'Невозможно привести объект типа' System.Collections.Generic.List 1[<>f__AnonymousType4 4 [System.String, System.TimeSpan, System.String, System.String]] 'для ввода' System.Collections.Generic. List`1

Что происходит только по графику доставки. Я попытался отладить его, и значения были правильными, однако это не удалось при преобразовании его в список в представлении. Что-то не так с моим кодом?

Большое спасибо за любую помощь заранее

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Эта строка явно выдает 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);

View

@model ViewModel

@{
    var DeliverySchedule = Model.DeliverySchedule;
}

В качестве примечания следует избегать использования ViewBag для передачи коллекций, поскольку ViewBag содержимое разрешается во время выполнения и требует дополнительного приведения для получения содержимого с правильным типом, вместо этого используйте строго типизированные свойства viewmodel.

0 голосов
/ 03 мая 2018

Вместо использования 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...