控制器中动作的路径模板不是一个有效的OData路径模板

本文关键字:路径 OData 有效 一个 控制器 | 更新日期: 2023-09-27 18:11:55

我得到以下错误:

控制器'Clients'中操作'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)

你知道我做错了什么吗?

控制器中动作的路径模板不是一个有效的OData路径模板

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

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)

Update:使用未绑定函数返回多个clientmodel。

下面的代码用于v4。对于v3,您可以使用action。

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)

路由错误:[ODataRoute("GetClients(Id={Id})")]

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

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