2010-11-19 5 views
1

J'utilise la méthode Sort de la grille MvcContrib pour générer des liens de tri, par ex.Tri de la grille MVC - personnaliser les liens

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

J'ai un besoin de changer le contrôleur/action par défaut qui est généré par la méthode de tri. Par exemple,

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

changerait à

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

Je n'ai pas été en mesure de trouver des méthodes existantes dans les classes de MVCcontribution qui me permettent de personnaliser les liens. J'apprécierais tous les conseils sur la façon de modifier les liens par défaut, car je suis encore très novice en MVC/C#.

Répondre

1

Ce n'est pas une tâche facile. Vous aurez besoin d'une grille personnalisée renderer pour y parvenir et remplacer la méthode 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); 
     } 
    } 
} 

Et puis préciser que la grille doit utiliser ce moteur de rendu:

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

Merci beaucoup pour l'exemple ci-dessus. Substituer les paramètres null dans la méthode GenerateLink a été le seul changement que j'ai dû apporter à la méthode de remplacement – baffled68

+0

par exemple - var link = HtmlHelper.GenerateLink (Context.RequestContext, RouteTable.Routes, column.DisplayName, null, "Index", "Accueil ", routeValues, null); – baffled68

+0

Comment le paramètre routeValues ​​est-il rempli? J'ai essayé: var routeValues ​​= HtmlHelper.AnonymousObjectToHtmlAttributes (nouveau {Column = column.SortColumnName, Direction = colonne. ???}); Où est la direction stockée? – Rookian

0

Je voulais donner un exemple de travail complet:

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

Utilisation:

.RenderUsing(new SortableHtmlTableGridRenderer<YourModelType>("Search", "Search")) 
Questions connexes