【问题标题】:MvcContrib Grid sort on related objectMvcContrib 对相关对象进行网格排序
【发布时间】:2011-03-08 11:55:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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);
    }
    

    【讨论】:

    • 谢谢,我先尝试使用“Country.Name”,但没有成功,所以我只尝试了 Country 并尝试在名称字段上设置 DataAnnotation [Key]。但仍然是同样的错误
    • @Daveo 嗯,这不是我所期望的!如果省略 SortColumnName() 会发生什么?它是否尝试按“国家”排序?
    • 如果我不添加 SortColumn 名称,它只是尝试对网格的第一列“名称”进行排序。如果我将 SortColumnName 放在您的答案中,它会显示“在 MyViewModel 类型上找不到名为 'Country.Name' 的属性”
    • @Daveo 在进行更多研究后,我更新了我的答案。
    • @Nathan 感谢您的努力,但这似乎是很多额外的代码,而且按照我在选择期间展平视图模型的回答中所建议的那样,它似乎更具可读性
    【解决方案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;}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 2011-07-22
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多