【问题标题】:MVC 3 WebGrid with a checkbox filter带有复选框过滤器的 MVC 3 WebGrid
【发布时间】:2023-03-14 03:25:01
【问题描述】:

我正在使用 MVC 3 RTM 开发一个 Web 应用程序。在一个视图中,我有一个 WebGrid 可以很好地进行排序和分页。但是,我还需要页面上的一些过滤支持,所以我添加了一个文本框和一个复选框。视图代码如下所示:

@using (Html.BeginForm("Index", "Customer", FormMethod.Get))
{
    <fieldset>
        <legend>Filter</legend>
        <div class="display-label">
            Search for</div>
        <div class="display-field">@Html.TextBox("filter", null, new { onchange = "$('form').submit()" })</div>
        <div class="display-label">
            Show inactive customers?
        </div>
        <div class="display-field">
            @Html.CheckBox("showInactive", false, new { onchange = "$('form').submit()" })
        </div>
    </fieldset>

    var grid = new WebGrid(canPage: true, canSort: true, ajaxUpdateContainerId: "grid", rowsPerPage: 10, defaultSort: "Name");
    grid.Bind(Model, rowCount: Model.Count, autoSortAndPage: false);
    grid.Pager(WebGridPagerModes.All);
    @grid.GetHtml(htmlAttributes: new { id = "grid" },
                  columns: grid.Columns(
                    grid.Column("Name", "Name"),
                    grid.Column("Address", "Address"),
                    grid.Column("IsActive", "Active", (item) => item.IsActive ? "Yes" : "No")));

}

这工作正常,除非我选中复选框。当我第一次加载页面时,未选中该复选框。排序和分页有效,我可以输入一些文本作为过滤器,它过滤我的结果,之后排序和分页仍然有效。但是,如果我选中该复选框,它会更新结果,但排序不再起作用。过滤器仍然有效,所以如果我输入一些文本,它会正确过滤结果并仍然尊重复选框。

我尝试在控制器中设置断点,那里没有问题。当我尝试排序时发送请求,并且控制器正确返回视图并将结果作为模型。但 WebGrid 似乎并没有自我更新。

有没有其他人经历过这种情况,或者对寻找什么有什么好的建议?

谢谢!

【问题讨论】:

    标签: asp.net-mvc-3 filter checkbox webgrid


    【解决方案1】:

    我通常添加一个表单(在我的 WebGrid 上方),其中包含一个名为“Keywords”的文本框和一个名为“IsActive”的复选框,当单击“Go”按钮时,它会重新加载 WebGrid,添加“Keywords”和“IsActive”查询字符串的选项。

    您可以在表单中添加更多元素,它们的值将被发送出去

    使用以下帮助脚本 - webgrid.helper.js

    function reloadGrid(form) {
        var grid = form._grid ? form._grid.value : "grid";
        var args = {};
        updateQueryParams(args, grid + " th a");
        args.sort = "";
        args.sortdir = "";
        updateQueryParams(args, grid + " tfoot a");
        args.page = 1;
    
        for (var i = 0; i < form.elements.length; i++) {
            var el = form.elements[i];
            if (el.type == "text" || el.type == "select" || (el.type == "radio" && el.checked))
                args[el.name] = el.value;
            else if (el.type == "checkbox")
                args[el.name] = el.checked;
        }
    
        //get controller name
        var s = $("#grid th a")[0].onclick.toString();
        s = s.substring(s.indexOf("/"));
        var controller = s.substring(0, s.indexOf("?"));
    
        var queryString = "";
        for (var key in args)
            queryString += "&" + key + "=" + escape(args[key]);
    
        var url = controller + "?" + queryString.substring(1);
        $("#" + grid).load(url + " #" + grid);
    }
    
    
    function updateQueryParams(args, path) {
        var links = $("#" + path);
        if (links.length == 0)
            return;
    
        var s = links[0].onclick.toString();
        s = s.substring(s.indexOf("?") + 1);
        s = s.substring(0, s.indexOf(" #"));
    
        var a = /\+/g;  // Regex for replacing addition symbol with a space
        var r = /([^&=]+)=?([^&]*)/g;
        var d = function (s) { return decodeURIComponent(s.replace(a, " ")); };
        var q = s;
    
        while (e = r.exec(q))
            args[d(e[1])] = d(e[2]);
    }
    

    然后在我的 webgrid 上方,我有以下部分文件 - *_ListFilter.cshtml*

    @using (Html.BeginForm(null, null, FormMethod.Get))
    { 
        <div id="filter">
        <table width="600">
        <tr>
        <td>@Html.TextBoxFor(c => c.Keywords, new { size = 50, placeholder = Strings.SearchByKeywords, title = Strings.SearchByKeywords })</td>
    
        <td>&nbsp
    

    【讨论】:

    • @Gunder:我的回答不断被服务器拒绝
    • 感谢您的回答@Tawani。我必须对你说实话,并说我没有尝试过你发布的代码,所以我不知道它是否能解决我在使用 WebGrid 时遇到的问题。但我确定是我在某处犯了错误,所以我接受你的回答,因为这是如何发布额外参数的一个很好的例子,这正是我想要的。但是,我决定放弃 WebGrid,因为它请求整个页面,而不仅仅是网格的数据。我改用jqGrid。它支持额外的参数没有任何问题,从那以后我没有回头。
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 2023-03-13
    • 2012-11-28
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2019-05-15
    相关资源
    最近更新 更多