相关对象

问题描述:

上MvcContrib电网排序我想用MvcContrib电网相关对象

做了相关表格的服务器端排序我

@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表达式必须有一个类型,它是为了媲美

我刚刚做了一个工作。

我添加了一个新属性到我的ViewModel,名为“CountryName”映射到Country.Name。这工作正常。

所以我的代码现在

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

我的视图模型

public string Name {get; set;} 
public Country Country {get; set;} 
public string CountryName {get; set;} 

did some digging,它看起来像它MvcContrib电网暴露没有原生的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); 
} 
+0

谢谢,我尝试使用“Country.Name”第一次,但没有工作,所以我尝试了国家,并试图并在名称字段上设置DataAnnotation [Key]。但仍然是相同的错误 – Daveo 2011-03-09 03:04:13

+0

@Daveo嗯,这不是我所期望的!如果你省略了SortColumnName(),会发生什么?它试图对“国家”进行排序吗? – 2011-03-09 04:30:30

+0

如果我不添加SortColumn名称,只需尝试对“名称”进行排序,该名称是网格的第一列。如果我把SortColumnName比如放在你的答案中,它会说“在类型MyViewModel上无法找到名为'Country.Name'的属性” – Daveo 2011-03-09 05:22:34