3

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

MyAscendingCustomSortAlgorithm并且MyDescendingCustomSortAlgorithm是返回按我的自定义算法排序的列表的函数。

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

我的问题是我怎样才能使它工作,并且仍然保持正确的分页

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

非常感谢您的帮助

4

3 回答 3

2

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

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

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

于 2012-04-12T16:17:07.503 回答
1

我会在您的方法参数中添加页码、行数、排序列和排序方向。它也应该只返回 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 查询来行

于 2012-04-12T02:11:38.107 回答
1

你应该这样搜索:

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

此外,您可以在 css 中添加一些链接到您的 customStype 的样式,即“光标:手”,以便用户看到标题是可点击的。

于 2012-04-10T00:12:32.660 回答