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

私はちょうど回避策をやっただけです。

Country.Name にマップされる "CountryName" という新しいプロパティを ViewModel に追加しました。これはうまくいきます。

だから私のコードは今です

 @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 に答える