我在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;值是否正确加上服务器的前缀?
感谢您抽出宝贵时间阅读本文。
答案 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;
}