jqgrid搜索复杂对象

时间:2014-01-31 13:20:01

标签: jquery jqgrid

我的colModel对象是一个json序列化对象,代表以下MovingRecord

public class CompanyData {
    public string Code { get; set; }
    public string Segment { get; set; }
    public string CompetenceArea { get; set; }
}

public class MovingRecord {
    public int MovingRecordID { get; set; }
    public CompanyData FromCompanyData { get; set; }
    public CompanyData ToCompanyData { get; set; }
    public float FTE { get; set; }
}

在jqGrid配置中,我有以下colModel:

colModel: [
    { name: 'FromCompanyData.Code', index: 'FromCompanyData.Code', width: 70, sortable: false, align: 'left', search: true, template: colTextTemplate },
    { name: 'FromCompanyData.Segment', index: 'FromCompanyData.Segment', width: 170, sortable: false, align: 'left', search: true, template: colTextTemplate },
    { name: 'FromCompanyData.CompetenceArea', index: 'FromCompanyData.CompetenceArea', width: 170, sortable: false, align: 'left', search: true, template: colTextTemplate },
    { name: 'ToCompanyData.Code', index: 'ToCompanyData.Code', width: 70, sortable: false, align: 'left', search: true, template: colTextTemplate },
    { name: 'ToCompanyData.Segment', index: 'ToCompanyData.Segment', width: 170, sortable: false, align: 'left', search: true, template: colTextTemplate },
    { name: 'ToCompanyData.CompetenceArea', index: 'ToCompanyData.CompetenceArea', width: 170, sortable: false, align: 'left', search: true, template: colTextTemplate },
    { name: 'FTE', index: 'FTE', width: 60, sortable: false, align: 'right', search: true, formatter: 'number', template: colFloatTemplate }
],

这完全符合预期。不幸的是问题是当我尝试搜索那些字段时。由于记录本身的性质,成员FromCompanyData/ToCompanyData可以是可以为空的对象。

使用以下代码激活搜索:

grid.jqGrid('navButtonAdd', '#' + pagerID, {
    caption: "", buttonicon: "ui-icon-search", position: "last", title: "Advanced search filters",
    onClickButton: function () {
        grid.jqGrid('searchGrid', 
            { sopt: ['eq', 'ne', 'lt', 'le', 'gt', 'ge', 'bw', 'cn'], closeOnEscape: true, multipleSearch: true, closeAfterSearch: true, recreateFilter: true });
    }
});

当我尝试搜索时,我总是收到以下错误"{Field Name} : the field is required".

有关如何解决此问题的任何帮助? 感谢

修改 根据Oleg评论,这是colTextTemplate

的定义
var colTextTemplate = {
    sorttype: 'text',
    align: 'left',
    search: true,
    stype: 'text',
    searchoptions: { sopt: ['eq', 'ne', 'bw', 'cn'] },
    searchrules: { required: true }
};

我尝试删除required: true选项并遇到了不同的行为。如果我删除此选项,原始错误消失,但构建的过滤器不包括数据字段,即使我用一些文本填充它。 例如,过滤器类似于以下

{
    "_search":true,
    "nd":1391184286612,
    "rows":9999,
    "page":1,
    "sidx":"MovingRecordID",
    "sord":"asc",
    "filters":"{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"FromCompanyData.Code\",\"op\":\"eq\",\"data\":\"\"}]}","searchField":"","searchString":"","searchOper":""}

1 个答案:

答案 0 :(得分:1)

最后一次更新对我来说仍然不太清楚。我认为您应该从required: true移除searchrules属性(或设置为required: false)。空数据的问题在我看来是另一个问题。这是jqGrid当前实现中的一个错误。我发布了here我的建议以解决问题。 Here是所需更改中最重要的部分。主要思想是:在使用搜索对话框中的数据之前触发change事件(请参阅the line)。应另外删除setTimeout(请参阅here)以使用搜索对话框中的当前数据。大约两个月前,The referenced pull request被合并到github上的jqGrid的主代码中,但最后发布的版本4.5.4仍包含该错误。我建议您在jquery.jqGrid.src.js的副本中进行描述修改。我希望它能解决你的问题。