2010-11-19 17 views
1

Sıralama şeritleri oluşturmak için MvcContrib Grid'in Sıralama yöntemini kullanıyorum.MVC ızgarası sıralama - bağlantılarını özelleştir

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

Sıralama yöntemi tarafından oluşturulan varsayılan denetleyiciyi/eylemi değiştirmem gerekiyor. Örneğin,

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

bana bağlantıları özelleştirmek için izin verecek MVCcontribution sınıflarında varolan herhangi yöntemlerini bulmak mümkün olmamıştır
customControllerName/customActionName/?Column=ProductId&Direction=Ascending 

olarak değişir. Hala bir MVC/C# yeni kullanıcı olduğumdan varsayılan bağlantıların nasıl değiştirileceğine dair herhangi bir gösterici için teşekkür ederiz.

cevap

1

Bu kolay bir iş değildir.

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

Sonra ızgara bu renderer kullanması gerektiğini belirtmek:

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

Yukarıdaki örnek için çok teşekkürler. GenerateLink yönteminde boş parametrelerin değiştirilmesi, örneğin geçersiz kılma yöntemiyle – baffled68

+0

yapmak zorunda olduğum tek değişiklikti - var link = HtmlHelper.GenerateLink (Context.RequestContext, RouteTable.Routes, column.DisplayName, null, "Index", "Home ", routeValues, null); – baffled68

+0

RotaValues ​​parametresi nasıl doldurulur? Denedim: var routeValues ​​= HtmlHelper.AnonymousObjectToHtmlAttributes (yeni {Column = column.SortColumnName, Direction = sütun. ???}); Yön nerede saklanıyor? – Rookian

0

Ben tam bir çalışma örneği sunmak istedik Sen bunu başarmak ve RenderHeaderText yöntemini geçersiz kılmak için özel bir ızgara renderer gerekir:

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

Kullanımı:

.RenderUsing(new SortableHtmlTableGridRenderer<YourModelType>("Search", "Search")) 
İlgili konular