2012-06-05 10 views
7

Burada özetlenen OData kurallarını kullanmadan, bir ASP.NET MVC4 Web API denetleyicisine querystring parametrelerini iletmenin bir yolu var mı? Ben o geleneksel ASP.NET yol yapıyor deneyin ne zaman OData sözleşmeleri kullanılmadan querystring parametrelerinin geçirilmesi?

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

Bazı depo yöntemler IQueryable desteklemek ve elle OData yazım kullanılarak olmadan bunları sayfalandırmak muktedir istemiyorum Dapper kullanılarak inşa var, ama "Rota bulunamadı" hatalarını alıyorum. Örneğin

, burada bir rota var: Ben olsun

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

:

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

Ve burada

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

maç için imzam Ve aşağıdaki sorguyu geçmek her aşağıdaki hata:

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

ASP.NET MVC4 Web API'sı içinde querystrings ile nasıl çalışılacağına dair herhangi bir öneriniz var mı?

+1

Bu, WebAPI'de bir hata olabileceğine inanıyorum. Öntanımlı değerlere sahip olmamak için action method parametrenizi değiştirmeyi deneyebilir misiniz (ve sorgu dizesindeki gerekli değerlerin tümünü içeren bir istek yayınlayın). – marcind

+0

Elbette, bu bir deneyeceğim. – Aaronontheweb

cevap

2

gibi yönlendirici değiştirmeye çalışırlar ama çalışıp çalışmadığını bilmiyorum, ben içine koşuyordu sorunu benim WebAPI kontrolör örneğinde GET için birden fazla yüke sahip olmasıydı. Onları kaldırdığımda (ve her şeyi, daha isteğe bağlı parametrelerle ve yöntemin kendisinde kontrol akışıyla bir Get yöntemine indirgendiğinde) her şey beklendiği gibi çalıştı.

10

Querystring kullanmaya başladığınızda, aslında kendi parametrelerine sahip gerçek bir denetleyici yöntemini çağırırsınız.

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

ve o zaman çalışacaktır

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

gibi sorgulamak her Bundan

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

içine yöntemini değiştirmek: Ben gibi yönlendirici değiştirmeyi tercih ne.

Bunu yazarken aklıma başka bir yöntem geldi. Bu durumda

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

Aslında ikinci seçeneği kullandım ve işe yarıyor, ancak URI'ları mantıksız ve "kesilebilir" yapmıyor – Aaronontheweb