【问题标题】:The path template on the action in controller is not a valid OData path template控制器中操作的路径模板不是有效的 OData 路径模板
【发布时间】:2014-08-27 11:36:16
【问题描述】:

我收到以下错误:

控制器“客户端”中操作“GetClients”的路径模板“GetClients()”不是有效的 OData 路径模板。未找到段“GetClients”的资源。

我的控制器方法如下所示

public class ClientsController : ODataController
{
    [HttpGet]
    [ODataRoute("GetClients(Id={Id})")]
    public IHttpActionResult GetClients([FromODataUri] int Id)
    {
        return Ok(_clientsRepository.GetClients(Id));
    }
}

我的 WebAPIConfig 文件有

builder.EntityType<ClientModel>().Collection
       .Function("GetClients")
       .Returns<IQueryable<ClientModel>>()
       .Parameter<int>("Id");

config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "odata",
    model: builder.GetEdmModel());

我希望能够像这样调用odata rest api:

http://localhost/odata/GetClients(Id=5)

知道我做错了什么吗?

【问题讨论】:

标签: c# asp.net-web-api odata asp.net-web-api-routing asp.net-web-api-odata


【解决方案1】:

您甚至不需要添加这样的函数来获取实体。

builder.EntitySet<ClientModel>("Clients")

就是你所需要的。

然后将你的动作写成:

public IHttpActionResult GetClientModel([FromODataUri] int key)
{    
      return Ok(_clientsRepository.GetClients(key).Single());
}

或者

这是有效的。以上方法无效:

public IHttpActionResult Get([FromODataUri] int key)
{    
    return Ok(_clientsRepository.GetClients(key).Single());
}

然后是Get请求

http://localhost/odata/Clients(Id=5)

http://localhost/odata/Clients(5)

会起作用的。

更新:使用未绑定函数返回多个 ClientModel。

以下代码适用于 v4。对于 v3,您可以使用操作。

builder.EntitySet<ClientModel>("Clients");
var function = builder.Function("FunctionName");
function.Parameter<int>("Id");
function.ReturnsCollectionFromEntitySet<ClientModel>("Clients");

在控制器中添加一个方法,如:

[HttpGet]
[ODataRoute("FunctionName(Id={id})")]
public IHttpActionResult WhateverName(int id)
{
    return Ok(_clientsRepository.GetClients(id));
}

发送如下请求:

GET ~/FunctionName(Id=5)

【讨论】:

  • 我得到没有找到与请求 URI 'localhost/odata/Clients(Id=5)' 匹配的 HTTP 资源。
  • 我使用的是 Odata v3,因为我使用的是使用 Odata 的 jaydata,它们似乎不适用于 v4。路由如何与 v3 配合使用?
  • 我将其更改为使用 v4 并按照您的说明进行操作,但现在没有数据返回。 localhost/odata/$metatdata 有效,但 localhost/odata/Clients(5 不返回任何内容
  • 进行了更改。仍然得到没有找到与请求 URI 'localhost/odata/Clients(5) 匹配的 HTTP 资源
  • 两种方法的区别仅在于名称。首先匹配“GetClientModel(int key)”,然后匹配“Get(int key)”。如您所说,后一个有效,而前一个无效,是实体类型的名称不等于“ClientModel”的原因吗?两种方法都适用于我的机器。
【解决方案2】:

这条路线不正确:[ODataRoute("GetClients(Id={Id})")]

应该是:[ODataRoute("Clients({Id})")]

网址应为:http://localhost/odata/Clients(Id=5)

【讨论】:

  • 使用 [ODataRoute("Clients({Id})")],您在模型中定义的函数永远不会被使用。如果您真的希望函数“GetClients”返回许多 ClientModels,我可以提供代码来做到这一点。
  • 是的,你能告诉我如何让它返回许多客户端模型吗?谢谢
猜你喜欢
  • 2018-03-31
  • 2018-08-25
  • 2015-11-03
  • 2011-03-10
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多