在.NET 4.0中,WebGrid + Paging + Sorting + Filtering中的filter丢失了

我已经实现了一个WebGrid。 排序,分页和过滤不能一起使用。 它们在您单独使用时起作用。 当您将三者结合使用时,过滤不起作用。

症状:
过滤结果集,然后排序。

要么

过滤结果集,然后转到下一页。

在这两种情况下,filter都会丢失。 但它确实是页面和排序。

在后面的代码中:当通过排序或分页调用action方法时,为每个filter参数显示null。

通过filter调用操作方法时,filter参数会通过。

这告诉我,当你开始排序或分页时,它没有提交表单。

public ActionResult MyPage(int? page, int? rowsPerPage, string sort, string sortdir, string orderNumber, string person, string product) 

我在SO和其他地方环顾四周。 有很多例子和人们都在询问如何做一个或另一个或全部三个。 但我只看到一个与我的问题 ,所以我在这里发布。 (他也没有解决)

我的页面实现如下:

 @using (Ajax.BeginForm("MyPage", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" })) { 
15 25 50 75 100
Order Number
Person
Product

@Html.Partial("_MyPage", Model)
}

网格实现为部分视图,如下所示:

  $(document).ready(function () { resetUI(); });  @{ var grid = new WebGrid(canPage: true, rowsPerPage: Model.rowsPerPage, canSort: true, ajaxUpdateContainerId: "grid", ajaxUpdateCallback: "resetUI"); grid.Bind(Model.rows, rowCount: Model.TotalRecords, autoSortAndPage: false); @grid.GetHtml( tableStyle: "fancyTable", headerStyle: "header", footerStyle: "footer", rowStyle: "row", alternatingRowStyle: "alt", mode: WebGridPagerModes.Numeric | WebGridPagerModes.NextPrevious, nextText: "Next", previousText: "Previous", htmlAttributes: new { id = "grid" }, columns: grid.Columns( grid.Column("OrderDate", "Order Date", format: @@((item.OrderDate != null) && (item.OrderDate.ToString("MM/dd/yyyy") != "01/01/0001") ? item.OrderDate.ToString("MM/dd/yyyy") : "")), grid.Column("OrderNumber", "Order Number"), grid.Column("Field1, "Field 1"), grid.Column("Field2", "Field 2"), grid.Column("Person", "Person"), grid.Column("Product", "Product"), grid.Column(format: (item) => Html.ActionLink("View", "Details", new { id = item.orderNumber })) ) ); } 

在构建分页和排序链接时,WebGrid帮助程序会考虑当前URL中存在的所有查询字符串参数 。 它忽略了POSTed和路由值。 由于您的搜索表单POST,用户在此表单中输入的值不在查询字符串中,因此它们不是分页和排序链接的一部分,当您单击其中一个链接时,值为丢失。 这是设计的。

所以解决这个问题的一种方法是替换你的AjaxForm:

 @using (Ajax.BeginForm("MyPage", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" })) 

使用GET动词的标准HTML表单:

 @using (Html.BeginForm("MyPage", null, FormMethod.Get)) 

或使用GET动词的AJAX表单:

 @using (Ajax.BeginForm("MyPage", null, new AjaxOptions { HttpMethod = "Get", InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" })) 

现在,当用户想要过滤某些内容并点击“搜索”提交按钮时,他在搜索表单中输入的值将最终出现在查询字符串中,并且在呈现WebGrid帮助程序时将使用它们来生成其Sort和Page链接,当然单击这些链接,值将被发送到服务器。

如果您想要对此进行更多控制,可以考虑使用更高级的网格控件,例如MvcContrib.Grid或Telerik Grid for ASP.NET MVC 。

将表单提交到分页链接指向的URL:

  

这对我没有帮助,但可能对你有帮助

只需为你的动作方法创建一个GET,只要一个排序或分页从网格中触发它就会遇到GET方法以及许多参数(你可以通过使用Web开发人员工具指向网格的分页号或排序标题来看到您的浏览器),您可以在那里过滤数据集,然后将模型传递给视图:

 [HttpGet] public ActionResult MyPage() 

每次进行排序或分页时,这个方法都会被命中,然后你可以进行过滤,你可以添加一些静态标志,这些标志可以根据你想要过滤的内容进行分配。