2015-10-02 10 views
5

Ich habe eine Reihe von Operationen auf meiner API, die generische GetById und GetByIds sind, die eine Entität herausziehen und über einen Formatierer zurückgeben.Wie kann ich einen int [] Parameter in Web-API erforderlich machen?

Diese Operationen wie folgt aussehen:

[HttpGet] 
[Route("ByIds")] 
public IHttpActionResult ByIds([FromUri]int[] ids) 
{ 
    var items = _myContext.SomeEntity.Where(a => ids.Contains(a.ID)).ToList(); 
    return SomeFormatter(items); 
} 

Wenn Sie dies zum Beispiel mit http://localhost/api/SomeEntity/ByIds?ids=1&ids=2 treffen, erhalten Sie ein Array mit 1 und 2 in wie man erwarten würde.

Wenn Sie dies mit http://localhost/api/SomeEntity/ByIds?ids= treffen, können Sie erwarten, ein leeres Array zu erhalten, aber Sie erhalten int[1] mit einem Wert von 0 drin.

Ich vermute, was passiert ist, es es als ein Element erkennt angegeben, kann es nicht konvertieren, so verwendet default(int) und legt, dass in das Array, das Ihnen einen int-Array mit einem Wert, den Wert von 0.

gibt Aber wenn Sie es mit http://localhost/api/SomeEntity/ByIds?ids=potato treffen, dann erhalten Sie einen ungültigen Modellstatus und ich behandle das automatisch. Die Frage ist, was ist ein Catch-Ansatz, um einen leeren Abfrageparameterwert entweder einem leeren Array oder einem ModelState-Fehler zuzuordnen (d. H. Das gleiche Verhalten wie potato, wenn Sie einen leeren Wert angeben)? Ich denke, dass ein modestate Fehler vorzuziehen ist und logischer ist.

+0

Ich traf dieses Problem auch. Hast du eine Lösung gefunden? In meinem Fall würde ich ein leeres Array dem ModelState-Fehler vorziehen. –

Antwort

1

Der int-Wert von 0 tritt auf, weil 0 für eine Zeichenfolge gleich null ist. Wenn Sie möchten, dass Ihr int einen Wert von null hat int verwenden?

Basicly:

int i = 0 

Ist die ganze Zahl Äquivalent von

string myString = null; 

Und wenn Sie Ihre int wollen null Nutzen sein:

int? i = null; 

Also, was passiert, ist das Array will mindestens einen Gegenstand, wird diesem Gegenstand kein Wert zugewiesen. Aber da der Standardwert einer ganzen Zahl 0 ist, wird es diesen Wert bekommen

+0

Und in Aktion, überprüfen Sie, ob Count == 1 und Element 0 ist Null, fügen Sie einen Fehler zu ModelState hinzu. –