Kendo Grid - oData - Web API-服务器端分页,过滤 - 十进制类型

时间:2014-10-06 02:42:54

标签: kendo-ui kendo-grid kendo-asp.net-mvc

我已使用以下内容设置了kendo网格:

  1. 带有oDataController的ASP.NET Web API,使用oData格式读取数据。
  2. 带有oData数据源的Kendo网格,带有服务器端分页,过滤和排序。
  3. 除了过滤不能使用十进制类型的列之外,所有内容都可以正常工作。在十进制类型列上使用过滤时,kendo会生成具有以下过滤器值的URL:

    $filter=Value gt 0.5
    

    Web API返回Bad Request,其中包含以下内容:

    {
      "odata.error":{
        "code":"","message":{
          "lang":"en-US","value":"A binary operator with incompatible types was detected. Found operand types 'Edm.Decimal' and 'Edm.Double' for operator kind 'GreaterThan'."
        }
      }
    }
    

    如果我使用URL并在0.5的末尾添加“M”以明确指定小数类型,那么它工作正常。显然,在使用Web API oData过滤时,对于某些类型(如decimal,double,datetime),您必须按照本文明确指定URL中的类型:http://microliteorm.wordpress.com/2013/09/06/webapi-odata-filtering/

    在网格中指定列类型方面,只有一种数字类型是“数字”。它没有double,decimal,integer等的不同类型。当在“number”列上使用过滤时,如何告诉Kendo网格指定URL中的实际类型(即double,decimal等)。请注意,过滤适用于日期时间类型。这只是数字类型的问题。

    编辑: 在oData上找到这篇文章(第6节),它指定了如何在URI中表示原始数据类型 - http://www.odata.org/documentation/odata-version-2-0/overview/

2 个答案:

答案 0 :(得分:1)

Kendo UI不支持intfloatdecimal等特定数字数据类型。在这个框架和JavaScript中,所有这些都只是数字。 Kendo提供number作为类型抽象,对您的理解有用,而不是浏览器或服务器的解释器。

正如Jeremy在评论中暗示的那样,在将0.5发送到服务器之前,您必须将0.5m的值替换为var ds = new kendo.data.DataSource({ transport: { //...other implementation details removed for brevity parameterMap: function(data, type) { if (type === 'read') { //...covert decimal values in the `data.filter` to strings ending with 'm' } } } }); Kendo UI DataSource提供了执行此操作的方法。

<div id="nyc_data">
<a href="#nyc_pics" class="hidden">nyc</a>
</div>

<div id="la_data">
<a href="#la_pics" class="hidden">la</a>
</div>

<div id="san_data">
<a href="#san_pics" class="hidden">san</a>
</div>

答案 1 :(得分:0)

我认为,转换过滤器可能更有效,更方便,而不是转换进来的数据流,一旦需要转换,这将是一个唯一项目的转换。 为此,请查看ODATA包装器,查询源代码。它应该有一个作为参数传入的state属性,并且该state属性有一个filter属性,它本身就是FilterDescriptor对象的树。您可能希望操纵这些,而不是所有数据。