【问题标题】:jqgrid Search with complex objectsjqgrid 搜索复杂对象
【发布时间】:2014-01-31 13:20:01
【问题描述】:

我的 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":""}

【问题讨论】:

  • 你能把colTextTemplate的定义包括进来吗?
  • @Oleg:当然。请看看我的编辑!
  • @Oleg:我没有消息? :(
  • 我完全忘记了这个问题:-(。我会根据我对问题的理解发布简短的答案。

标签: jquery jqgrid


【解决方案1】:

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

【讨论】:

  • 好的。进行您建议的修改似乎有效。希望这些修改将很快添加到下一个版本中。非常感谢您的帮助。干得好:)
  • 有关您的更新的更多信息。我遇到当用户输入文本时,我删除了setTimeout 函数的更改事件没有触发。但是当我再次单击输入元素以使他获得焦点时,它会正确触发...
  • @Lorenzo: 1) 正如我所写,pull 已经合并到 jqGrid 的主代码中。所以 jqGrid 的下一个版本将有描述的变化。 2) 删除 setTimeout 仅在字段中使用 jQuery UI 自动完成的情况下很重要。如果一个人不删除setTimeout 并使用jQuery UI 自动完成,一个人使用searchOnEnter: true 选项,那么可能会出现以下错误:一个人在某个输入字段中快速键入一些文本并在最后键入“Enter”。在用于搜索的数据不使用输入数据的情况下。我的更改应该可以解决问题。不客气!
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2020-04-25
  • 2018-07-30
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多