【问题标题】:Kendo UI Grid with ODataAction binded to collection带有 OData 操作的 Kendo UI 网格绑定到集合
【发布时间】:2014-03-24 18:19:00
【问题描述】:

我正在尝试将 Kendo UI Grid 与绑定到集合的 ODataAction 一起使用。在这种情况下,我应该在网格数据源中将请求类型指定为 POST。但在这种情况下,我失去了排序、过滤等功能,因为 OData 参数在请求正文中传递,而 OData 控制器无法解析它。

 URL example: "/odata/MyEntityCollection/MyCustomAction"

目前我正在使用绑定到 OData 服务本身的操作来避免该问题。

URL example: "/odata/MyCustomAction"

这不需要是 POST 动作。但过了一段时间,我得到了很多方法,它变得非常混乱。

有没有人遇到过类似的问题?有没有更好的方法来避免 ODataAction 限制?

提前致谢!

【问题讨论】:

    标签: http web asp.net-web-api odata kendo-grid


    【解决方案1】:

    如果将 WebApi OData 升级到最新版本,则可以解决此问题。现在是 5.2.0-alpha1-140307。

    请参考此示例: http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataFunctionSample/

    其中的 Top10 方法很好地解决了您的场景。您唯一需要做的就是在 ProductsController.cs 中将 [EnableQuery] 添加到 Top10。就像这样:

    [HttpGet]
    [EnableQuery]
    public IHttpActionResult Top10()
    {
        var retval = _data.Values.OrderByDescending(p => p.Price).Take(10).ToList();
        return Ok(retval);
    }
    

    然后您可以安全地向 URL 添加查询选项,例如,

    GET http://localhost:9010/odata/Products/Default.Top10()?$orderby=Id desc&$filter=Id gt 46
    
    StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
    {
      OData-Version: 4.0
      Date: Mon, 24 Mar 2014 09:54:57 GMT
      Server: Microsoft-HTTPAPI/2.0
      Content-Length: 304
      Content-Type: application/json; odata.metadata=minimal; odata.streaming=true;
    charset=utf-8
    }
    {
      "@odata.context":"http://localhost:9010/odata/$metadata#Products","value":[
        {
          "Id":95,"Name":"Product 95","Price":998.542812186546
        },{
          "Id":88,"Name":"Product 88","Price":993.66847052875369
        },{
          "Id":58,"Name":"Product 58","Price":932.89687947039351
        }
      ]
    }
    

    注意:

    1. 新版本 API 的命名空间由 System.Web.Http.OData 更改为 System.Web.OData。
    2. 版本可以在示例的 packages.config 中找到。

    【讨论】:

    • 似乎是我要找的东西,但是在安装了 System.Web.OData 包的预发布版本后,我遇到了很多问题,尤其是没有更多的实体方法模型生成器。似乎它已被 EntityType 取代,但它无法正常工作并且在 modelBuilder.GetEdmModel() 行上失败。实体“...”没有定义键。我还发现了关于 OData 更改的非常有用的文章:blogs.msdn.com/b/webdev/archive/2014/03/13/…
    • 新版本中Entity方法重命名为EntityType。如果将 CLR 类型添加为 Edm 实体类型,则它必须包含属性 Id 或 {ClassName}Id ,它将作为实体类型键添加。原因是 OData 协议要求实体类型必须有一个或多个键。在这种情况下,必须有Id或ProductId,并且不区分大小写。
    • 如果我有复杂键的实体模型怎么办?或者例如我正在使用根本不包含 Id 的视图模型。我们对以前的版本没有这样的限制。
    • 复杂类型不需要有 Id 属性,因此您可以修改 Top10 方法,使其返回复杂类型实例的集合。
    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多