MVC网格排序 - 自定义链接
问题描述:
我正在使用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#新手。
答
这不是一件容易的事。您将需要一个自定义网格渲染器来实现这一点,并覆盖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>())
答
我想提供一个完整的工作示例:
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"))
非常感谢上面的例子。替换GenerateLink方法中的null参数是我必须对覆盖方法 – baffled68 2010-11-20 01:11:03
进行的唯一更改 - var link = HtmlHelper.GenerateLink(Context.RequestContext,RouteTable.Routes,column.DisplayName,null,“Index”,“Home “,routeValues,null); – baffled68 2010-11-20 01:11:33
routeValues参数是如何填充的?我试过:var routeValues = HtmlHelper.AnonymousObjectToHtmlAttributes(new {Column = column.SortColumnName,Direction = column。???});方向存储在哪里? – Rookian 2012-12-21 11:38:53