2011-03-08 192 views
2

上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表達式必須有一個類型,它是爲了媲美

回答

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

我的視圖模型

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

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