【问题标题】:jqGrid's search filters are not loading in MVC 4jqGrid 的搜索过滤器未在 MVC 4 中加载
【发布时间】:2014-09-07 07:49:15
【问题描述】:

我正在尝试使用 JQGrid 和 MVC4 实现高级搜索。我的模型的定义似乎很好(如下):

public class SearchModel
{
    public string sidx { get; set; } 
    public string sord { get; set; } 
    public int page { get; set; } 
    public int rows { get; set; } 
    public bool _search { get; set; } 
    public string searchField { get; set; } 
    public string searchOper { get; set; } 
    public string searchString { get; set; }
    public FilterModel filters { get; set; }
}
public class FilterModel
{
    public string groupOp { get; set; }
    public List<RuleModel> rules { get; set; }
}
public class RuleModel
{
    public string field { get; set; }
    public string op { get; set; }
    public string data { get; set; }
}

但是,当我运行并搜索 UserName 和 FirstName 时,接收控制器将过滤器显示为 null。然后我检查了(Request.Params)[“filters”],它显示了以下文本 -

"{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"UserName\",\"op\":\"eq\",\"data\":\"a\"},{\"field\":\"FirstName\",\"op\":\"eq\",\"data\":\"b\"}]}"

它显示 _search 为真。我错过了什么吗?

【问题讨论】:

  • 您能发布您收到的完整 json 请求吗?
  • 抱歉,如何获取 JSON?我正在使用 JQGrid 的 URL 选项来指定操作,仅此而已。
  • 你试过我的答案了吗?
  • 是的,那也没用。当我将过滤器更改为字符串时,它正在填充内容。但我想作为一个对象。

标签: jquery asp.net-mvc-4 jqgrid advanced-search


【解决方案1】:

如果我记得正确,请求包含一个匿名 JSON 对象(没有任何名称),因此在您的控制器中您不能传递一个 SearchModel 参数,您必须明确添加所有参数:

ActionName (string sidx, string sord, int page, ..., FilterModel filters)

另一种方法是编写自定义模型绑定器(这很简单),它将您的请求参数包装到单个 SearchModel 对象中。

【讨论】:

  • 确实适用于所有其他选项。简单的搜索工作正常。但只是导致问题的高级搜索。
  • 发布您在请求中获得的查询字符串 (Request.QueryString)
  • 我认为与 HTML 编码有关...我得到的 QueryString 为:_search=true&nd=1410081961485&rows=10&page=1&sidx=&sord=asc&filters=%7b%22groupOp%22%3a%22AND %22%2c%22rules%22%3a%5b%7b%22field%22%3a%22IsActive%22%2c%22op%22%3a%22eq%22%2c%22data%22%3a%22true%22%7d %5d%7d
【解决方案2】:

我认为您遇到的主要问题是 filters 参数将由 jqGrid 以另一种方式作为所有其他参数发送。您可以将其定义为string 并手动从JSON 转换为FilterModel(使用Newtonsoft.JsonJsonConvert.DeserializeObject&lt;FilterModel&gt;(filters) 或使用serializer.Deserialize&lt;FilterModel&gt;(filters),其中JavaScriptSerializer serializer = new JavaScriptSerializer();)。在我看来,这是最简单的方法。您当然可以使用 MVC 的自定义模型绑定器,但最终会得到相同的结果。

或者您可以尝试更改发送 jqGrid 的filters 参数的值

serializeGridData: function (postData) {
    var dataToSend = $.extend({}, postData); // make copy
    if (dataToSend.filters) {
        dataToSend.filters = $.parseJSON(postData.filters);
    }
    // the last statement can be not needed and one should just use
    //     return dataToSend;
    // instead. If one do convert the data to JSON as in the line below
    // one should use ajaxGridOptions: { contentType: "application/json" }
    // option of jqGrid to set the corresponding ContentType HTTP header
    return JSON.stringify(dataToSend);
}

我没有测试上面的代码,但我认为它可以工作。

另外我想发表一些常见的评论。

您需要仅针对非常大的数据集实施服务器端配对和过滤。例如,如果数据行少于 1000 行,我更喜欢使用 loadone: true 参数并将 所有数据 一次性返回给客户端。在客户端过滤此类数据集工作得非常好(作为服务器端过滤甚至更快),您不需要编写任何服务器代码进行过滤。所以:不要尝试在小数据集上使用服务器端过滤。

下一句。如果您只使用高级搜索,那么您可以删除 searchFieldsearchOpersearchString 参数。 “简单”搜索是遗留模型。

下一句:发送jqGrid的参数的默认名称不是最好的:sidxsord_search。可以使用jqGrid 的prmNames 参数重命名 jqGrid 发送的几乎所有参数。例如,如果您要使用 prmNames: {sort: "sortIndex", order: "sortDirection", search: "isSearching"},您可以在 SearchModel 中将 sidx 重命名为 sortIndexsord 重命名为 sortDirection,并将 _search 重命名为 isSearching

最后一句话。如果您确实需要实现服务器端数据过滤,您可以考虑实现here 中描述的full 模型。它包括groups 部分和rules。如果您将multipleGroup: true 选项与multipleSearch: true 一起使用,则groups 部分将被填充。

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 2011-06-25
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多