Шаблон пути для действия в контроллере не является допустимым шаблоном пути OData
Я получаю следующую ошибку:
Шаблон пути '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());
Я надеюсь, что смогу назвать api rest odata следующим образом:
http://localhost/odata/GetClients(Id=5)
Есть идеи, что я делаю не так?
2 ответа
Вам даже не нужно добавлять такую функцию, чтобы получить сущность.
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)
буду работать.
Обновление: используйте несвязанную функцию, чтобы вернуть много ClientModels.
Следующий код для 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)
Этот маршрут неверен: [ODataRoute("GetClients(Id={Id})")]
Так должно быть: [ODataRoute("Clients({Id})")]
URL должен быть: http://localhost/odata/Clients(Id=5)