2010-11-19 65 views
1

我正在使用MvcContrib网格的排序方法来生成排序链接,例如,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

这不是一件容易的事。您将需要一个自定义网格渲染器来实现这一点,并覆盖RenderHeaderText方法:

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

,然后指定网格要使用此渲染:

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

非常感谢上面的例子。替换GenerateLink方法中的null参数是我必须对覆盖方法 – baffled68 2010-11-20 01:11:03

+0

进行的唯一更改 - var link = HtmlHelper.GenerateLink(Context.RequestContext,RouteTable.Routes,column.DisplayName,null,“Index”,“Home “,routeValues,null); – baffled68 2010-11-20 01:11:33

+0

routeValues参数是如何填充的?我试过:var routeValues = HtmlHelper.AnonymousObjectToHtmlAttributes(new {Column = column.SortColumnName,Direction = column。???});方向存储在哪里? – Rookian 2012-12-21 11:38:53

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