MVC.Grid 将模型数据返回到 actionresult 的分页问题
MVC.Grid paging issue returning model data back to actionresult
我有一个这样的操作结果,我在其中使用下拉值来限制查询结果:
public ActionResult RequestList(OrdersViewModel obj)
{
var source = from i in db.RequestsWithHours select i;
if (obj.SubmittorName != null )
{
source = source.Where(z => z.RequesterID == obj.SubmittorName);
}
这对第 1 页工作正常,但当我按第 2 页时,obj 为空并且查询恢复到所有记录。
查看:
@Html.Grid(Model.Data).Columns(columns =>
{
columns.Add(o =>o.RequestNum).Titled("Number")
columns.Add(z => z.Status).Sortable(true);
}).WithPaging(15)
如何保留分页操作结果中的 obj 值?
实际上,在 Grid.Mvc 中进行过滤的最佳方法是使用其过滤功能。分页链接发出 GET 请求,因此当然不会提供下拉列表中的值,您将在控制器操作中获得 null
。
过滤能力被证明here and here.
让我们看看您将如何修改代码以创建自定义过滤小部件。
在具有已知 ID 的隐藏元素中呈现您的下拉列表,如下所示:
<div id="dropDownContainer" style="display: none">
@* Razor code that renders the dropdown *@
</div>
为小部件编写 JavaScript 代码。如果它将在多个页面中使用,最好将其保存在一个文件中并包含它,否则,您可以在 Razor 视图中内联编写它:
function SubmittorFilterWidget() {
this.getAssociatedTypes = function () {
return ["SubmittorFilterWidget"];
};
this.showClearFilterButton = function () {
return true;
};
this.onRender = function (container, lang, typeName, values, cb, data) {
this.value = values.length > 0 ? values[0] : { filterType: 1, filterValue: "" };
// Clone the dropdown list and append the cloned instance to the filter panel. We do so because Grid.MVC distroys the viewe when the filter panel is closed
var dropdown = document.getElementById("dropDownContainer").firstElementChild.cloneNode(true);
container[0].appendChild(dropdown);
dropdown.addEventListener("change", function () {
cb([{ filterValue: this.value, filterType: 1 /* Equals */ }]);
});
};
}
将您的列重命名为 SubmittorName 并将其绑定到过滤器小部件:
columns.Add(o =>o.RequestNum, "SubmittorName").Titled("Number").SetFilterWidgetType("SubmittorFilterWidget");
这样,过滤器将出现在 RequestNum 列上方,但实际上会根据 SubmittorName
进行过滤
注册过滤器小部件(将此脚本放在上面JS代码之后的视图底部):
<script>
$(function () {
pageGrids.gridName.addFilterWidget(new SubmittorFilterWidget());
});
</script>
其中 gridName
是您在渲染时提供的网格名称。您可能需要将第一行修改为 @Html.Grid(Model.Data).Named("gridName").Columns(columns =>
告诉我这些修改的结果如何。
至于其他网格组件的建议:我看到 Grid.Mvc 不成熟并且多年来停止获得贡献。如果这是一个企业级项目,我建议你去Syncfusion Grid。根据类似于 Visual Studio 的社区版许可证,它们的组件是免费的。如果这是一个小项目或单个页面,您可以继续Grid.MVC。
我有一个这样的操作结果,我在其中使用下拉值来限制查询结果:
public ActionResult RequestList(OrdersViewModel obj)
{
var source = from i in db.RequestsWithHours select i;
if (obj.SubmittorName != null )
{
source = source.Where(z => z.RequesterID == obj.SubmittorName);
}
这对第 1 页工作正常,但当我按第 2 页时,obj 为空并且查询恢复到所有记录。
查看:
@Html.Grid(Model.Data).Columns(columns =>
{
columns.Add(o =>o.RequestNum).Titled("Number")
columns.Add(z => z.Status).Sortable(true);
}).WithPaging(15)
如何保留分页操作结果中的 obj 值?
实际上,在 Grid.Mvc 中进行过滤的最佳方法是使用其过滤功能。分页链接发出 GET 请求,因此当然不会提供下拉列表中的值,您将在控制器操作中获得 null
。
过滤能力被证明here and here.
让我们看看您将如何修改代码以创建自定义过滤小部件。
在具有已知 ID 的隐藏元素中呈现您的下拉列表,如下所示:
<div id="dropDownContainer" style="display: none"> @* Razor code that renders the dropdown *@ </div>
为小部件编写 JavaScript 代码。如果它将在多个页面中使用,最好将其保存在一个文件中并包含它,否则,您可以在 Razor 视图中内联编写它:
function SubmittorFilterWidget() { this.getAssociatedTypes = function () { return ["SubmittorFilterWidget"]; }; this.showClearFilterButton = function () { return true; }; this.onRender = function (container, lang, typeName, values, cb, data) { this.value = values.length > 0 ? values[0] : { filterType: 1, filterValue: "" }; // Clone the dropdown list and append the cloned instance to the filter panel. We do so because Grid.MVC distroys the viewe when the filter panel is closed var dropdown = document.getElementById("dropDownContainer").firstElementChild.cloneNode(true); container[0].appendChild(dropdown); dropdown.addEventListener("change", function () { cb([{ filterValue: this.value, filterType: 1 /* Equals */ }]); }); }; }
将您的列重命名为 SubmittorName 并将其绑定到过滤器小部件:
columns.Add(o =>o.RequestNum, "SubmittorName").Titled("Number").SetFilterWidgetType("SubmittorFilterWidget");
这样,过滤器将出现在 RequestNum 列上方,但实际上会根据 SubmittorName
进行过滤注册过滤器小部件(将此脚本放在上面JS代码之后的视图底部):
<script> $(function () { pageGrids.gridName.addFilterWidget(new SubmittorFilterWidget()); }); </script>
其中 gridName
是您在渲染时提供的网格名称。您可能需要将第一行修改为 @Html.Grid(Model.Data).Named("gridName").Columns(columns =>
告诉我这些修改的结果如何。
至于其他网格组件的建议:我看到 Grid.Mvc 不成熟并且多年来停止获得贡献。如果这是一个企业级项目,我建议你去Syncfusion Grid。根据类似于 Visual Studio 的社区版许可证,它们的组件是免费的。如果这是一个小项目或单个页面,您可以继续Grid.MVC。