3

Hallo Jungs, ich bin neu zu Routing-Attribute und nicht sicher, ob das überhaupt möglich ist.Mehrere optionale Parameter Web-Api-Attribut-Routing

Was ich habe, ist ein Attribut Route, die fein wie diese jetzt

[HttpGet] 
[Route("GetIssuesByFlag/{flag:int=3}")] 
public IEnumerable<IssueDto> GetIssuesByFlag(int flag) 

arbeitet aber ich einige zusätzliche optionale Parameter hinzufügen möchte, dass meine Suche verengen, so möchte ich 2 zusätzliche optionale Parameter hinzuzufügen.

, was ich versucht habe:

[HttpGet] 
[Route("GetIssuesByFlag/{flag:int=3?}/{categoryId:int?}/{tagIds?}")] 
public IEnumerable<IssueDto> GetIssuesByFlag(int flag , int? categoryId = null, int?[] tagIds = null) 

Dies funktioniert gut, wenn mein Anruf /api/controller/1/2 ist aber nicht mit 404, wenn es um /api/controller/1 kommt

Wie ich dies erreichen kann?

Edit 1: Die Antwort von Nkosi funktionierte, aber eine zusätzliche Modifikation wurde benötigt.

[HttpGet] 
[Route("GetIssuesByFlag/{flag:int=3}/{tagIds?}/{categoryId:int?}")] 
public IEnumerable<IssueDto> GetIssuesByFlag(int flag , List<int> tagIds, int? categoryId = null) 

Die Liste oder Array muss Sekunde sein, da sie automatisch null ist, wenn kein Wert angegeben wird, und kann nicht als optional mit = null

+1

'{Flag: Int = 3?}' ist das Problem. Es ist entweder optional '{flag: int?}' mit dem Standardwert in der Aktion oder '{flag: int = 3}'. Sie haben derzeit 3 ​​optionale Parameter. wenn Sie nur die 1-Wert-Routing-Tabelle nicht wissen, welche optionale Parameter, die Sie beziehen sich auf die 404 – Nkosi

+0

Nikosis Antwort für mich gearbeitet! Nun, die erste, nicht die Spaltung, entfernt, dass alles funktioniert jetzt gut – Harry

+0

ersten (die Option von Flag optional entfernen) können Sie es auf Antworten aktualisieren, damit ich als richtig markieren kann? – Harry

Antwort

1

{flag:int=3?} ist das Problem. Es ist entweder optional {flag:int?} mit dem Standardwert in der Aktion oder {flag:int=3}.

[HttpGet] 
Route("GetIssuesByFlag/{flag:int=3}/{categoryId:int?}/{tagIds?}")] 
public IEnumerable<IssueDto> GetIssuesByFlag(int flag , int? categoryId = null, int?[] tagIds = null) 

Sie haben derzeit 3 ​​optionale Parameter. Wenn Sie nur die 1-Wert-Routing-Tabelle nicht wissen, welche optionale Parameter, die Sie beziehen sich auf die 404

0

Verwenden eine Abfragezeichenfolge markiert werden.

[HttpGet] 
    [Route("GetIssuesByFlag/{flag:int=3?}")] 
    public IEnumerable<IssueDto> GetIssuesByFlag(int flag, List<int> tagIds, int? categoryId = null) 

Url:/getissuesbyflag/1 tagIds = 2,5,6 & categoryId = 56

Sie wirklich Query-Strings für optionale Parameter und Pfadparameter verwenden sollten, wenn sie benötigt werden?.

+0

Es funktioniert wieder, wenn ich alle Variablen zur Verfügung stelle, aber wenn ich nur das Flag zur Verfügung stelle, scheitert es mit "message": "Es wurde keine HTTP-Ressource gefunden, die der Anfrage-URI entspricht" https: // localhost: 44363/api/Issues/GetIssuesByFlag/1 '. ", " messageDetail ":" Es wurde keine Aktion auf dem Controller' Issues 'gefunden, die der Anfrage entspricht. " – Harry