我有这样的动作结果,我在下拉值值限制查询结果:
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为null,查询还原为所有记录。
查看:
@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中过滤的最佳方法是使用其过滤能力。分页链接问题获取请求,因此,当然,未提供下拉中的值,您将在控制器操作中获得null
。此处和此处都显示了过滤能力。
让我们看看如何修改代码以创建自定义过滤窗口小部件。
-
将您的下拉列表放在带有类似已知ID的隐藏元素中:
<div id="dropDownContainer" style="display: none"> @* Razor code that renders the dropdown *@ </div>
-
编写小部件的JavaScript代码。如果将其用于多个页面,则最好将其保存在文件中并包含它,否则,您可以在剃须刀视图中写入它:
: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 */ }]); }); }; }
-
将您的列重命名为submittoramame并将其绑定到过滤器小部件:
: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。