MvcContrib Grid сортировать по связанному объекту - PullRequest
2 голосов
/ 08 марта 2011

Я хочу выполнить сортировку на стороне сервера связанной таблицы с помощью MvcContrib Grid

У меня есть

 @Html.Grid(Model.Result).Columns(column =>
{
    column.For(u => u.Name).Named("Name");
    column.For(u => u.Country.Name).Named("Country").SortColumnName("Country");
 }).Sort(Model.GridSortOptions)

Правильно отображает таблицу / сетку. Однако я не могу отсортировать по стране. Имя я получаю сообщение об ошибке

Выражения DbSortClause должны иметь тип, порядок которого сопоставим

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Я только что закончил работу.

Я добавил новое свойство в свою ViewModel под названием "CountryName", которое отображается в Country.Name.Это отлично работает.

Так что мой код теперь

 @Html.Grid(Model.Result).Columns(column =>
{
    column.For(u => u.Name).Named("Name");
    column.For(u => u.CountryName).Named("Country");
 })

И моя ViewModel

public string Name {get; set;}
public Country Country {get; set;}
public string CountryName {get; set;}
2 голосов
/ 08 марта 2011

I выполнил некоторое копание , и похоже, что нативный метод OrderBy (), который предоставляет MvcContrib Grid, не поддерживает сортировку данных в подсвойстве.

В действии контроллера, которое обрабатываетПредставляя и сортируя данные, вместо вызова data = data.OrderBy(sort.Column, sort.Direction), вам нужно будет немного изменить поведение.В вашем случае самым простым решением, вероятно, будет специальная обработка значения «Country.Name», а затем использование поведения по умолчанию для остальных сортируемых столбцов.Что-то вроде этого должно быть достаточно:

public ActionResult Index(GridSortOptions sort) {
  ViewData["sort"] = sort;
  var data = GetData();

  if (!string.IsNullOrEmpty(sort.Column)) {
    if(sort.Column.Equals("Country.Name", StringComparison.OrdinalIgnoreCase)) {
        if(sort.Direction == SortDirection.Ascending) {
            data = data.OrderBy(d => d.Country.Name);
        } else {
            data = data.OrderByDescending(d => d.Country.Name);
        }
    } else {
        data = data.OrderBy(sort.Column, sort.Direction);
    }   
  }

  return View(data);
}
...