我已经实现了一个WebGrid。排序,分页和过滤不能一起使用。它们在您单独使用时起作用。当你将三者合并时,过滤不起作用。
症状:
过滤结果集,然后排序。
或
过滤结果集,然后转到下一页。
在这两种情况下,过滤器都会丢失。但它会进行分页和排序。
在后面的代码中: 当通过排序或分页调用action方法时,显示每个过滤器参数的空值。
通过过滤器调用操作方法时,过滤器参数会通过。
这告诉我,当你开始排序或分页时,它没有提交表格。
public ActionResult MyPage(int? page, int? rowsPerPage,
string sort, string sortdir,
string orderNumber, string person, string product)
我在SO和其他地方环顾四周。有很多例子和人们会问如何做一个或另一个或全部三个。但我只看过one with my issue,所以我在这里发帖。 (他也没有解决)
我的页面实现如下:
@using (Ajax.BeginForm("MyPage", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }, new { id = "filter" }))
{
<div class="right">
<select id="rowsPerPage" name="rowsPerPage">
<option>15</option>
<option>25</option>
<option>50</option>
<option>75</option>
<option>100</option>
</select>
</div>
<div class="table">
<div class="tableRow">
<div class="tableCell">
Order Number
</div>
<div class="tableCell">
Person
</div>
<div class="tableCell">
Product
</div>
</div>
<div class="tableRow">
<div class="tableCell">
<input type="text" id="orderNumber" name="orderNumber" />
</div>
<div class="tableCell">
<input type="text" id="person" name="person" />
</div>
<div class="tableCell">
<input type="text" id="product" name="product" />
</div>
<div class="tableCell">
<input type="submit" class="button" value="Search" />
</div>
</div>
</div>
<br/>
<div id="myGrid">
@Html.Partial("_MyPage", Model)
</div>
}
网格实现为部分视图,如下所示:
<script type="text/javascript">
$(document).ready(function () {
resetUI();
});
</script>
@{
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: @<text>@((item.OrderDate != null) && (item.OrderDate.ToString("MM/dd/yyyy") != "01/01/0001") ? item.OrderDate.ToString("MM/dd/yyyy") : "")</text>),
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 }))
)
);
}
答案 0 :(得分:24)
在构建分页和排序链接时,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帮助程序时将使用它们来生成其“排序”和“页面”链接。当然,当您点击这些链接时,这些值将被发送到服务器。
如果您想要对此进行更多控制,可以考虑使用更高级的网格控件,例如MvcContrib.Grid或Telerik Grid for ASP.NET MVC。
答案 1 :(得分:1)
将表单提交到分页链接指向的URL:
<script type="text/javascript">
$(function () {
$('th a, tfoot a').click(function () {
$('form').attr('action', $(this).attr('href')).submit();
return false;
});
});
</script>
这对我没有帮助,但可能对你有帮助
答案 2 :(得分:1)
只需为您的操作方法创建一个GET,每当一个排序或分页从网格中触发它就会遇到GET方法以及许多参数(您可以通过使用Web指向网格的分页号或排序标题来查看您的浏览器的开发人员工具),您可以在那里过滤数据集,然后将模型传递给视图:
[HttpGet]
public ActionResult MyPage()
每次你进行排序或分页这个方法都会被命中,然后你可以进行过滤,你可以添加一些静态标志,可以根据你想要过滤的内容来分配。