我收到以下错误:
控制器“客户端”中操作“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)
知道我做错了吗?
答案 0 :(得分:11)
您甚至不需要添加这样的函数来获取实体。
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());
}
然后获取请求
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)
答案 1 :(得分:-1)
此路线不正确:[ODataRoute("GetClients(Id={Id})")]
应该是:[ODataRoute("Clients({Id})")]
网址应为:http://localhost/odata/Clients(Id=5)