2012-06-05 4 views
7

Gibt es eine Möglichkeit, Querystring-Parameter an einen ASP.NET MVC4-Web-API-Controller zu übergeben, ohne die hier beschriebenen OData-Konventionen zu verwenden?Übergeben von Querystring-Parametern ohne Verwendung von OData-Konventionen?

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

Ich habe einige Repository Methoden Dapper gebaut, die nicht wollen IQueryable unterstützen und in der Lage sein, diese manuell Paginieren, ohne die OData Konventionen, aber wenn ich es die traditionelle ASP.NET Weise versuchen zu tun Ich bekomme "route not found" Fehler.

Zum Beispiel, hier ist ein Weg:

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

Und hier ist die Unterschrift

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

übereinstimmen Und wenn ich übergeben Sie die folgende Abfrage:

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

ich der folgende Fehler:

Haben Sie Vorschläge zum Arbeiten mit Querystrings in ASP.NET MVC4 Web API?

+1

Ich glaube, das könnte ein Fehler in WebAPI sein. Könnten Sie versuchen, den Parameter Ihrer Aktionsmethode so zu ändern, dass er keine Standardwerte enthält (und eine Anforderung mit allen erforderlichen Werten in der Abfragezeichenfolge ausgibt). – marcind

+0

Sicher marcind, ich werde es versuchen. – Aaronontheweb

Antwort

2

In diesem Fall zu ändern, das Problem, das ich in lief, war die Tatsache, dass ich mehrere Überlastungen für GET auf meinem WebAPI Controller-Instanz hatte. Als ich diese entfernt habe (und alles auf eine Get-Methode mit mehr optionalen Parametern und Kontrollfluss in der Methode selbst reduziert habe), hat alles wie erwartet funktioniert.

10

Wenn Sie beginnen, Querystring zu verwenden, nennen Sie tatsächlich die genaue Methode des Controllers mit seinen Parametern. Was ziehe ich Sie Ihren Router zu ändern, wie:

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

und dann Ihre Methode ändern in

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

Von nun an, wenn Sie Abfrage wie

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

es laufen wird.

Eine andere Methode fiel mir beim Schreiben dieses. Ich weiß nicht, ob es aber versuchen, funktioniert der Router wie

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

Ich habe tatsächlich die zweite Option verwendet und es funktioniert, aber es macht die URIs nicht intuitiv und nicht "hackable" – Aaronontheweb

Verwandte Themen