使用复杂对象的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":""}

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

最新更新