2010-11-19 4 views
1

MvcContribグリッドのSortメソッドを使用してソートリンクを生成しています。MVCグリッドソート - リンクのカスタマイズ

<%= Html.Grid(Model).AutoGenerateColumns().Sort((GridSortOptions)ViewData["sort"]) %> 

ソートメソッドによって生成されたデフォルトのコントローラ/アクションを変更する必要があります。例えば、

defaultControllerName/defaultActionName/?Column=ProductId&Direction=Ascending 

customControllerName/customActionName/?Column=ProductId&Direction=Ascending 

に変化するであろう、私は私がリンクをカスタマイズすることができるようになるMVCcontributionクラス内の既存の方法を見つけることができませんでした。私はMVC/C#初心者のままで、既定のリンクを変更する方法については、何か指摘しておきたいと思います。

答えて

1

これは簡単な作業ではありません。

public class MyHtmlTableGridRenderer<T> : HtmlTableGridRenderer<T> where TViewModel : class 
{ 
    protected override void RenderHeaderText(GridColumn<TViewModel> column) 
    { 
     if (IsSortingEnabled && column.Sortable) 
     { 
      // TODO: generate a custom link here based on the sorting options 
      string text = ... 
      base.RenderText(text); 
     } 
     else 
     { 
      RenderText(column.DisplayName); 
     } 
    } 
} 

そしてグリッドはこのレンダラーを使用する必要があることを指定します:あなたはこれを達成し、RenderHeaderTextメソッドをオーバーライドするカスタムグリッドレンダラが必要になります

.RenderUsing(new MyHtmlTableGridRenderer<Employee>()) 
+0

上記の例で多くのありがとうございます。 GenerateLinkメソッドにnullパラメータを代入するのは、オーバーライドメソッド – baffled68

+0

に対して行った唯一の変更です。たとえば、var link = HtmlHelper.GenerateLink(Context.RequestContext、RouteTable.Routes、column.DisplayName、null、 "Index"、 "Home "、routeValues、null); – baffled68

+0

routeValuesパラメータはどのように設定されていますか?私は試みました:var routeValues = HtmlHelper.AnonymousObjectToHtmlAttributes(new {Column = column.SortColumnName、Direction = column。???});方向はどこに保存されていますか? – Rookian

0

私は完全な作業例を提供したかったです。

public class SortableHtmlTableGridRenderer<T> : HtmlTableGridRenderer<T> where T : class 
{ 
    readonly string _action; 
    readonly string _controllerName; 

    public SortableHtmlTableGridRenderer(string action, string controllerName) 
    { 
     _action = action; 
     _controllerName = controllerName; 
    } 

    protected override void RenderHeaderText(GridColumn<T> column) 
    { 
     if (IsSortingEnabled && column.Sortable) 
     { 
      string sortColumnName = GenerateSortColumnName(column); 

      bool isSortedByThisColumn = GridModel.SortOptions.Column == sortColumnName; 

      var sortOptions = new GridSortOptions 
      { 
       Column = sortColumnName 
      }; 

      if (isSortedByThisColumn) 
      { 
       sortOptions.Direction = (GridModel.SortOptions.Direction == SortDirection.Ascending) 
        ? SortDirection.Descending 
        : SortDirection.Ascending; 
      } 
      else //default sort order 
      { 
       sortOptions.Direction = column.InitialDirection ?? GridModel.SortOptions.Direction; 
      } 

      var routeValues = HtmlHelper.AnonymousObjectToHtmlAttributes(new {sortOptions.Column, sortOptions.Direction }); 
      var text = HtmlHelper.GenerateLink(Context.RequestContext, RouteTable.Routes, column.DisplayName, null, _action, _controllerName, routeValues, null); 
      RenderText(text); 
     } 
     else 
     { 
      RenderText(column.DisplayName); 
     } 
    } 
} 

用途:

.RenderUsing(new SortableHtmlTableGridRenderer<YourModelType>("Search", "Search")) 
関連する問題