jqgrid搜索:如何指定搜索列?

时间:2012-02-15 19:40:57

标签: asp.net-mvc asp.net-mvc-3 entity-framework jqgrid filter

我在EF4 MVC3(C#)上使用jqgrid。我基于this @Oleg的解决方案进行搜索,该解决方案工作正常并且符合我的需求。

我的网格中定义了以下列:

          ...
          { name: 'Stato', index: 'StatoTicketID', width: 20, align: 'left', sorttype: 'int', searchoptions: { sopt: ['eq']} },
          { name: 'StatoTicketID', index: 'StatoTicketID', width: 20, align: 'left', sorttype: 'int', hidden: true, searchoptions: { sopt: ['eq']} },
          ...

如您所见,列Stato按索引StatoTicketID(隐藏整数字段)排序,排序正常。

问题

当我尝试搜索Stato的值时,过滤器会以索引StatoTicketID作为字符串传递,而我想按Stato值搜索。所以我在控制器中得到一个异常,它指定我不能将String类型转换为Int32。

当index在不同的列上时,是否存在指定应用搜索列的方法,就像在我的情况下一样?

编辑&替代方法: 现在我通过以下解决方法解决了我的问题。

        (inside foreach (Rule rule in rules) of FilterObjectSet by Oleg)
         ....

         if (rule.field == "StatoTicketID")
            {
                rule.field = "StatoTicket.Stato";
                propertyInfo = typeof(T).GetProperty("stringfield"); // where stringfield is a text type column of my model
            }

我很清楚这不是一个优雅的解决方案,我希望您能够直接从jqGrid知道如何实现所需的行为。

提前致谢

1 个答案:

答案 0 :(得分:3)

在我看来,你选择的方式过于复杂。我只是发送给客户端(到jqGrid)只有Stato并且必须StatoTicketID。从StatoTicketID的设计点开始,服务器实现的一部分就是服务器实现的一部分,客户端不应该依赖于此。

如果您在Stato表的StatoTickets列上有唯一约束(或唯一索引),则只要您需要,就可以很快找到StatoTicketID。因此,jqGrid只能包含和“知道”Stato,并且没有关于StatoTicketID作为实现细节的信息。

解决问题的另一种方法是在formatter: 'select'列中使用Stato。重要的是要了解在{<1}}文本和Stato之间的映射应该在之前加载创建网格。如果StatoTicketID列应具有类似

的属性
Stato

我不能在formatter: 'select', edittype: 'select', editoptions: {value: '12:Stato1;24:Stato2'}, stype: 'select', searchoptions: {value: ':All;12:Stato1;24:Stato2'} 中使用dataUrl代替value

结果,您可以使用editoptions数据填充Stato列,但相应的文本将由jqGrid显示。

我建议您最好使用纯StatoTicketID文本实现第一种方式。您只能在服务器部分解决所有问题。