【问题标题】:FIlter by enum field in Kendo Grid在 Kendo Grid 中按枚举字段过滤
【发布时间】:2015-08-24 13:13:41
【问题描述】:

我在 Kendo UI 中使用网格来显示实体列表。实体中的属性之一是枚举。我通过调用 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

据我所知,剑道网格生成的查询字符串无法更改,因此无法使用枚举的完全限定名称作为发送到服务器的值的前缀。有没有办法让 OData 将值解释为服务器端的枚举或让网格将“过滤依据”值正确地发送到服务器?

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

【问题讨论】:

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


    【解决方案1】:

    刚刚发现有一种方法可以使 OData URI 解析器在解释枚举值时不那么严格。在配置上调用 EnableEnumPrefixFree 将使解析器尝试解析该值并将其与枚举成员之一匹配。 OData 配置现在如下所示:

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes(); //This has to be called before the following OData mapping and before the WebApi mapping
        config.MapODataServiceRoute("ODataRoute", "odata", GetEdmModel());
        config.EnableEnumPrefixFree(enumPrefixFree: true);
    }
    

    【讨论】:

      【解决方案2】:

      是的,有一种方法可以在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;
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 2013-07-10
        相关资源
        最近更新 更多