Шаблон пути для действия в контроллере не является допустимым шаблоном пути 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 odata rest следующим образом:

http://localhost/odata/GetClients(Id=5)

Любая идея, что я делаю неправильно?


person Nate    schedule 07.07.2014    source источник
comment
Аналогичная ошибка здесь - stackoverflow.com/questions/27824774/   -  person sashoalm    schedule 16.02.2017


Ответы (2)


Вам даже не нужно добавлять такую ​​функцию, чтобы получить сущность.

builder.EntitySet<ClientModel>("Clients")

это все, что тебе нужно.

И затем напишите свое действие как:

public IHttpActionResult GetClientModel([FromODataUri] int key)
{    
      return Ok(_clientsRepository.GetClients(key).Single());
}

Or

Вот что сработало. Вышеупомянутое не сработало:

public IHttpActionResult Get([FromODataUri] int key)
{    
    return Ok(_clientsRepository.GetClients(key).Single());
}

Затем запрос Get

http://localhost/odata/Clients(Id=5)

or

http://localhost/odata/Clients(5)

заработает.

Обновление: используйте несвязанную функцию, чтобы вернуть много моделей 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)
person Feng Zhao    schedule 09.07.2014
comment
Я получаю сообщение Не найден ресурс HTTP, соответствующий URI запроса 'localhost/odata/Clients(Id=5) '. - person Nate; 10.07.2014
comment
Я использую Odata v3, потому что я использую jaydata, который использует Odata, и они, похоже, не работают с v4. Как маршрутизация работает с v3? - person Nate; 10.07.2014
comment
Сделал подмену. все еще получаю Не найден ресурс HTTP, соответствующий URI запроса 'localhost/odata/Clients(5) - person Nate; 10.07.2014
comment
Отличие двух методов только в названии. Сначала будет сопоставлен GetClientModel (ключ int), а затем будет сопоставлен Get (ключ int). Как вы сказали, последний работает, а предыдущий - нет, это причина того, что имя типа сущности не равно ClientModel? Оба метода работают на моей машине. - person Feng Zhao; 10.07.2014
comment
Отличный материал. Спасибо, бро - person Hugo Nava Kopp; 15.03.2017

Этот маршрут неверен: [ODataRoute("GetClients(Id={Id})")]

Должно быть: [ODataRoute("Clients({Id})")]

URL-адрес должен быть: http://localhost/odata/Clients(Id=5)

person Nate    schedule 07.07.2014
comment
С [ODataRoute(Clients({Id}))] функция, определенная вами в модели, никогда не используется. Если вы действительно хотите, чтобы функция GetClients возвращала много ClientModels, я могу предоставить код для этого. - person Feng Zhao; 09.07.2014
comment
Да, можете ли вы показать мне, как заставить это возвращать много клиентских моделей? Спасибо - person Nate; 10.07.2014