控制器中动作的路径模板不是一个有效的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)
你知道我做错了什么吗?
您甚至不需要添加这样的函数来获取实体。
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)