2016-08-02 40 views
2

Ich muss gleichzeitig eine query-Parameter-basierte Route (/api/models?id=1) und eine routenbasierte Route (/api/models/1) unterstützen und dennoch einen eindeutigen Zugriff auf die Modellsammlung (/api/models) erlauben?Wie kann ich FromQuery und FromRoute-Parameter gleichzeitig binden?

Mein Controller aussieht (etwas) wie folgt aus:

[Route("/api/{controller}")] 
public class ModelsController : Controller 
{ 
    [HttpGet] 
    public Models[] GetModels([FromQuery]QueryOptions queryOptions) 
    { 
     //... 
    }  

    [HttpGet("{id:int}")] 
    public Model Get([FromRoute] int id) 
    { 
     //... 
    } 

    [HttpGet("?{id:int}")] 
    public Model Get2Try1([FromQuery] int id) 
    { 
     //Fails with ": The literal section '?' is invalid. 
     //Literal sections cannot contain the '?' character." 
     //Which makes sense after some reading... 
    } 

    [HttpGet] 
    public Model Get2Try2([FromQuery] int id) 
    { 
     //Fails with "AmbiguousActionException: Multiple actions matched. 
     //The following actions matched route data and had all constraints satisfied: 
     //GetModels and Get2Try2" 
     //Which I think I understand as well...the absence of optional params 
     //means ambiguous routing... 
    } 

    [HttpGet] //What here? 
    public Model Get2Try3([FromQuery] int id) //and/or here? 
    { 

    } 
} 

Ich mag es fühlen sollte eine gewisse Art und Weise zu (mit deklarative Routing) sein erreichen dies. Hat jemand in dieser Richtung etwas unternommen?

Aktuelle Code-Basis ist ASP.NET Core (RC1), die in Kürze auf RTM/1.0 aktualisiert werden soll. Details auf beiden Seiten sind wahrscheinlich ähnlich, sind aber an beiden interessiert.

Antwort

3

ich gefunden habe, dass die folgenden Werke:

[HttpGet, Route("{id?}")] 

... der Schlüssel in erster Linie das Wesen '?'. Sie benötigen keine [FromX] in der Methodensignatur, dies macht den Trick und bietet sowohl für die Abfragezeichenfolge als auch für die Parameterübergabe an.

Leider hat Swagger UI mag es nicht, und erwartet, dass einige explizite Parameter aus dem Kasten heraus arbeiten (https://github.com/domaindrivendev/Ahoy/issues/47 oder https://github.com/domaindrivendev/Ahoy/issues/182), aber das ist eine andere Geschichte :)

+0

Das ist nicht für mich arbeiten. Es funktioniert als [FromRoute] und funktioniert nicht als [FromQuery] – neeohw