我在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知道如何实现所需的行为。
提前致谢
答案 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
文本实现第一种方式。您只能在服务器部分解决所有问题。