过滤Kendo Grid的enum字段

时间:2015-08-24 13:13:42

标签: enums asp.net-mvc-5 kendo-grid filtering odata-v4

我在Kendo UI中使用网格来显示实体列表。实体中的一个属性是Enum。我通过调用OData控制器使用OData v4从MVC 5应用程序填充网格。使用的OData库是Microsoft.AspNet.Odata v5.6。这就是网格数据源的定义方式:

type: "odata-v4",
transport: {
            read: {
                url: "/odata/Groups/",
                dataType: "json"
            }
        },

,控制器操作就像

一样简单
[Authorize]
[HttpGet]
[EnableQuery(PageSize = 20)]
public IQueryable<Group> GetGroups()
{
    return _GroupService.GetGroups();
}

Group实体定义为

public class Group
{
    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Resources.BusinessEntitiesResources))]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int ID { get; set; }

    [Required(ErrorMessageResourceName = "FieldRequired", ErrorMessageResourceType = typeof(Resources.BusinessEntitiesResources))]
    [StringLength(100)]
    public string Name { get; set; }

    public EnumDepositMethod? DepositMethod { get; set; }
}

现在,通过DepositMethod列进行过滤不起作用。错误消息是无法比较枚举和字符串类型的值。这是发送到服务器的有效负载:

http://localhost:49680/odata/Groups?format=json&top=20&filter=DepositMethod+eq+DebitCard&count=true

据我所知,kendo网格生成的查询字符串无法更改,因此无法使用枚举的完全限定名称为发送到服务器的值添加前缀。有没有办法让OData将值解释为服务器端的枚举,或者使网格发送&#34;过滤器&#34;值是否正确加上服务器的前缀?

感谢您抽出宝贵时间阅读本文。

1 个答案:

答案 0 :(得分:0)

是的,有一种方法可以更改dataSource.transport.parameterMap功能中网格生成的过滤器。 我使用的一个解决方法是在kendo数据源对象的parameterMap函数中进行正则表达式替换。例如,见下文。

            parameterMap: function (data,operation) {
            if (operation == "read") {
                var paramMap = kendo.data.transports.odata.parameterMap(data);
                if (paramMap.$filter) {
                    paramMap.$filter = paramMap.$filter.replace(/Level\s+(.+)\s+'(.+)'/, "Level $1 System.Diagnostics.Tracing.EventLevel'$2'");
                }
                return paramMap;
            }