我收到以下错误:
The path template 'GetClients()' on the action 'GetClients' in controller 'Clients' is not a valid OData path template. Resource not found for the segment 'GetClients'.
我的 Controller 方法是这样的
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")
就是你所需要的。
然后把你的 Action 写成:
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)
会起作用。
更新:使用未绑定(bind)函数返回多个 ClientModel。
以下代码适用于 v4。对于 v3,您可以使用操作。
builder.EntitySet<ClientModel>("Clients");
var function = builder.Function("FunctionName");
function.Parameter<int>("Id");
function.ReturnsCollectionFromEntitySet<ClientModel>("Clients");
在 Controller 中添加一个方法,如:
[HttpGet]
[ODataRoute("FunctionName(Id={id})")]
public IHttpActionResult WhateverName(int id)
{
return Ok(_clientsRepository.GetClients(id));
}
发送如下请求:
GET ~/FunctionName(Id=5)
关于c# - Controller 中操作的路径模板不是有效的 OData 路径模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602935/