ASP.NET MVC 3使用升序和降序选项对WebGrid进行自定义排序

本文关键字:WebGrid 选项 排序 自定义 降序 MVC NET 升序 ASP | 更新日期: 2023-09-27 18:29:56

Helo,我正在开发一个ASP.NET MVC 3应用程序。

我有一个视图

var grid = new WebGrid(rowsPerPage: 10, ajaxUpdateContainerId: "GridDiv",canPage: true,canSort: true);
grid.Bind(source: Model);
grid.Pager(WebGridPagerModes.All);
@grid.GetHtml(htmlAttributes: new { id="grid" },
    columns: grid.Columns(
    grid.Column("Name"),
    grid.Column("Age"),
    grid.Column("Sex")
)

在控制器中,我有一个自定义的排序算法来对数据进行排序。我既有自定义升序排序,也有自定义降序排序。

当用户单击列标题时,我希望按照我的自定义排序算法而不是内置算法对行进行排序。

为此,我尝试了以下操作(我使用"sortdir"并相应地处理它)

控制器

public ActionResult Persons(string sortdir)
{    
    PersonsListModel = GetAllPersonsList();
    if(sortdir=="ASC")
        return View(MyAscendingCustomSortAlgorithm(PersonsListModel ));
    else
        return View(MyDescendingCustomSortAlgorithm(PersonsListModel ));
}

MyAscendingCustomSortAlgorithmMyDescendingCustomSortAlgorithm是返回按我的自定义算法排序的列表的函数。

当页面加载时,列表的排序是正确的,但当我点击标题时,排序就混乱了。我进行了调试,一切正常。

我的问题是,我如何才能做到这一点,并且仍然保持正确的寻呼

我也尝试过设置canSort: false,但是我不能再点击标题了。

非常感谢您的帮助

ASP.NET MVC 3使用升序和降序选项对WebGrid进行自定义排序

您是否尝试关闭Bind()方法中的autoSortAndPage参数?

grid.Bind(source: Model, autoSortAndPage : false);

我知道你想保留现有的分页,但我不确定是否有办法同时拥有这两种分页。您可能需要在操作方法中手动执行分页操作。

您应该这样搜索:

  1. 禁用排序
  2. 向列标题添加自定义样式(.GetHtml html属性中的"headerStyle:customStyle")。查看"设置网格样式"一章
  3. 使用jquery向具有此样式的所有元素添加live点击处理程序,当用户点击时,检查它是哪一列,并相应地发布到您的控制器,控制器将刷新页面

此外,您可以在css中添加一些链接到customStepe的样式,即"cursor:hand",这样用户就可以看到标题是可点击的。

我会将页码、行数、排序列和排序方向添加到方法的参数中。它还应该只返回json数据。您应该用javascript处理这些数据以更新视图。

您可以将自己的排序css类添加到标题中,并链接到ajax操作。可以用javascript对网格进行寻址,只需更改数据行。

public JsonResult Persons(int pagenumber,int rows, string sortcol, string sortdir)
{    
if(sortdir=="ASC")
    return DataSource(pagenumber,rows,sortcol,MyAscendingCustomSortAlgorithm);
else
    return DataSource(pagenumber,rows,sortcol,MyDescendingCustomSortAlgorithm);
}

您可以将排序函数传递到数据源调用中,并使用它返回json数据。您可以使用linq查询来行