MvcContrib对相关对象进行网格排序

时间:2011-03-08 11:55:16

标签: asp.net-mvc entity-framework-4 mvccontrib mvccontrib-grid

我想使用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表达式必须具有可比较的类型

2 个答案:

答案 0 :(得分:2)

I did some digging看起来像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);
}

答案 1 :(得分: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;}