2012-06-05 5 views
7

Есть ли способ передать параметры запроса на контроллер ASP.NET MVC4 Web Api без использования описанных здесь соглашений OData?Передача параметров запроса без использования соглашений OData?

http://www.asp.net/web-api/overview/web-api-routing-and-actions/paging-and-querying

У меня есть некоторые хранилища методов построены с использованием щеголеватого, которые не поддерживают IQueryable и хотят, чтобы иметь возможность вручную постраничные их без использования конвенций OData, но всякий раз, когда я пытаюсь делать это традиционный способ ASP.NET Я получаю ошибки «маршрут не найден».

Например, вот маршрут:

context.Routes.MapHttpRoute(
      name: "APIv1_api_pagination", 
      routeTemplate: "api/v1/{controller}/{id}", 
      defaults: new { area = AreaName, controller = "category", offset = 0, count = 100}); 

И вот совпадение подписи

public class CategoryController : ApiController 
{ 
    // GET /api/<controller> 
    public HttpResponseMessage Get(int id, int offset = 0, int count = 0) 

И всякий раз, когда я прохожу следующий запрос:

http://localhost/api/v1/category/1?offset=10

Я получаю следующая ошибка:

No action was found on the controller 'Category' that matches the request.

Любые предложения о том, как правильно работать с querystrings в ASP.NET MVC4 Web Api?

+1

Я считаю, что это может быть ошибка в WebAPI. Не могли бы вы попытаться изменить параметр метода действия, чтобы не иметь значений по умолчанию (и выдавать запрос со всеми необходимыми значениями в строке запроса). – marcind

+0

Уверенный marcind, я попробую. – Aaronontheweb

ответ

2

В этом случае вопрос я впадающих был тот факт, что у меня было несколько перегрузок для ГЭТ на мой экземпляр контроллера WebAPI. Когда я удалил их (и спрятал все до одного метода Get с более дополнительными параметрами и контролем потока внутри самого метода), все работало, как ожидалось.

10

Когда вы начинаете использовать querystring, вы на самом деле вызываете точный метод контроллера с его параметрами. То, что я предпочитаю, чтобы вы изменить свой маршрутизатор, как:

context.Routes.MapHttpRoute(
     name: "APIv1_api_pagination", 
     routeTemplate: "api/v1/{controller}/{action}/{id}", 
     defaults: new { area = AreaName, controller = "category", offset = 0, count = 100}); 

, а затем изменить свой метод в

public HttpResponseMessage Items(int id, int offset = 0, int count = 0); 

Теперь, когда вы запрашиваете как

http://localhost/api/v1/category/Items?id=1&offset=10&count=0 

он будет работать.

Еще один метод пришел мне на ум во время написания этого. Я не знаю, если он работает, но попытаться изменить маршрутизатор как

context.Routes.MapHttpRoute(
     name: "APIv1_api_pagination", 
     routeTemplate: "api/v1/{controller}/{id}/{offset}/{count}", 
     defaults: new { area = AreaName, controller = "category", offset = RouteParameter.Optional, count = RouteParameter.Optional}); 
+0

Я фактически использовал второй вариант, и он работает, но он делает URI неинтуитивными, а не «взломанными», – Aaronontheweb