2

我想使用 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)

这将正确显示表格/网格。但是我不能按 Country.Name 排序我得到一个错误

DbSortClause 表达式必须具有顺序可比的类型

4

2 回答 2

2

做了一些挖掘,看起来 MvcContrib Grid 公开的本机 OrderBy() 方法不支持对子属性的数据进行排序。

在处理呈现和排序数据的控制器操作中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);
}
于 2011-03-08T14:19:18.807 回答
2

我刚刚结束了工作。

我在 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;}
于 2011-03-09T10:20:52.480 回答