在.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()
每次进行排序或分页时,这个方法都会被命中,然后你可以进行过滤,你可以添加一些静态标志,这些标志可以根据你想要过滤的内容进行分配。
上述就是C#学习教程:在.NET 4.0中,WebGrid + Paging + Sorting + Filtering中的filter丢失了分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/950847.html