Есть ли опция OrderBy для ViewBag - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь отсортировать элементы списка ViewBag, вызываемого через ForEach.

Я вижу, что есть опция Model.OrderBy.

Есть ли что-то подобное для ViewBag?

Мой код выглядит следующим образом:

<select class="list-box tri-state" id="ParentID" name="ParentID">
    @foreach (var item in ViewBag.EmployeeList)
    {
        <option value="@item.Id">@item.FirstName @item.LastName</option>
    }
</select>

В идеале я бы хотел, чтобы список выбора сортировался по FirstName, LastName, но сортировка по умолчанию по Id.

Как мне исправить это?

1 Ответ

0 голосов
/ 03 июля 2018

ViewBag является динамическим.

Таким образом, предполагая, что он был установлен в контроллере как

List<Employee> employees = getEmployeeList();

this.ViewBag.EmployeeList = employees;

//...

return View(model);

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

@foreach (var item in (ViewBag.EmployeeList as List<Employee>)
    .OrderBy(_ => _.FirstName).ThenBy(_ => _.LastName)) {
      <option value="@item.Id">@item.FirstName @item.LastName</option>
}

В качестве альтернативы вы можете отсортировать его в контроллере, прежде чем назначить его на ViewBag, и просто сделать так, чтобы код зацикливал коллекцию в представлении.

List<Employee> employees = getEmployeeList()
    .OrderBy(_ => _.FirstName).ThenBy(_ => _.LastName)
    .ToList();

this.ViewBag.EmployeeList = employees;

//...
...