2010-11-19 4 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 была единственным изменением, которое я должен был сделать для метода переопределения – baffled68

+0

, например: var link = HtmlHelper.GenerateLink (Context.RequestContext, RouteTable.Routes, column.DisplayName, null, "Index", "Home ", routeValues, null); – baffled68

+0

Как заполняется параметр routeValues? Я попытался: var routeValues ​​= HtmlHelper.AnonymousObjectToHtmlAttributes (новый {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")) 
Смежные вопросы