Бритва перебирает Viewbag и привязывается к нему

1

У меня есть список объектов в моем контроллере.

это выглядит так

{ Driver = System.Data.Entity.Driver_Driver1, Statuss = NotConfirmed }
{ Driver = System.Data.Entity.Driver_Driver2, Statuss = NotConfirmed }

обратите внимание, что Driver является объектом сложного типа.

Контроллер:

var Drivers = _db.Drivers.Where(x => x.DriverCompanyID == id).Where(d => d.CanWorkIn.Where(f => f.CompanyToDriveFor.CompanyID == OwnCompany.CompanyID).Any())
                    .Select(x => new
                    {
                        Driver = x,
                        Statuss = x.CanWorkIn.FirstOrDefault().Status.ToString()

                    }).ToList();

ViewBag.ListOfDrivers = Drivers;
return PartialView("_DriverList");

Моя модель

   public class DriverViewItem 
    {
        public Driver Driver { get; set; }
        public string Statuss { get; set; }
    }

Мой взгляд

@model List<MyApp.web.Models.DriverViewItem>

и этот последний бит не работает. декларация модели.

  • 0
    Можете ли вы показать более точно, как вы добавляете код в ViewBag?
  • 0
    Вы должны использовать модель для анализа сложных данных в представлении
Показать ещё 7 комментариев
Теги:
viewbag

2 ответа

0

Сначала создайте строго типизированный класс со свойствами, которые вам нужны. Я назвал свой DriverViewItem.

Затем в вашем контроллере измените выбор, чтобы выбрать этот DriverViewItem и проанализируйте список как модель для представления.

var Drivers = _db.Drivers.Where(x => x.DriverCompanyID == id).Where(d => d.CanWorkIn.Where(f => f.CompanyToDriveFor.CompanyID == OwnCompany.CompanyID).Any())
            .Select(x => new DriverViewItem()
            {
                Driver = x,
                Statuss = x.CanWorkIn.FirstOrDefault().Status

            }).ToList();

return PartialView("_DriverList", Drivers);

В представлении вам нужно будет сказать, что вы ожидаете, что ваша модель вы сможете сделать это с помощью:

@model List<DriverViewItem>

Затем вы можете выполнить итерацию по таким элементам:

@foreach(DriverViewItem item in Model)
{
    <div>
        <p>@item.Driver.{what ever property}</p>
        <p>@item.Statuss</p>
    </div>
}

Это гораздо более чистый способ, чем анализ данных с помощью ViewBag.

  • 0
    Я пытался вот так, поэтому, возможно, я неправильно понимаю модель, public class DriverViewItem { public Driver Driver { get; set; } public string Status { get; set; } }
  • 0
    @ user3812199 Это выглядит правильно для меня. Трудно сказать, не видя остальной код? Есть ли у вас код в онлайн-контроле исходного кода?
Показать ещё 2 комментария
0

Было бы лучше использовать модель, чтобы передавать данные такого типа. Но чтобы ответить на вопрос напрямую, в контроллере назначьте его как массив элементов в сумку просмотра

ViewBag.Data = {
    new { Driver = System.Data.Entity.Driver_Driver1, Status = NotConfirmed },
    new { Driver = System.Data.Entity.Driver_Driver2, Status = NotConfirmed }
}

И в разметке:

@{
  if (ViewBag.Data != null){
     foreach (var item in ViewBag.Data) {
        //show the item in the view
     }
  }
}
  • 0
    Хотя это технически отвечает на вопрос, это не очень хорошая практика.
  • 0
    Обновлено, чтобы включить этот совет. Это выбор ОП, хотя ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню