带有复选框过滤器的MVC 3 WebGrid

时间:2011-03-24 12:18:07

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

我正在使用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似乎没有自我更新。

有没有其他人经历过这个,或者对于要寻找什么有任何好的建议?

谢谢!

1 个答案:

答案 0 :(得分: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