2015-10-02 18 views
5

Ho un sacco di operazioni sulla mia API che sono generiche GetById e GetByIds che estraggono un'entità e la restituiscono tramite un programma di formattazione.Come posso rendere necessario un parametro int [] in web api?

Queste operazioni simile a questa:

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

Se colpite questo con http://localhost/api/SomeEntity/ByIds?ids=1&ids=2 per esempio, si ottiene un array con 1 e 2 in come ci si aspetterebbe.

Se si raggiunge questo valore con http://localhost/api/SomeEntity/ByIds?ids=, è possibile che venga visualizzato un array vuoto, ma si ottiene int[1] con un valore di 0.

Ho il sospetto che quello che succede è che lo riconosce come un elemento specificato, non è in grado di convertire, quindi usa default(int) e mette che nella matrice, che ti dà un array int con un valore, il valore 0.

Tuttavia, se la colpisci con http://localhost/api/SomeEntity/ByIds?ids=potato, ottieni uno stato modello non valido e lo gestisco automaticamente.

La domanda è, qual è un approccio catch all di mappare un valore di parametro query vuoto su un array vuoto o un errore ModelState (ovvero lo stesso comportamento di potato se si fornisce un valore vuoto)? Penso che un errore di stato modello sarebbe preferito ed è più logico.

+0

Ho riscontrato anche questo problema. Hai trovato una soluzione? Nel mio caso preferirei un array vuoto all'errore ModelState. –

risposta

1

Il valore int di 0 si verifica perché 0 è uguale a null per una stringa. Se vuoi che int abbia un valore di null use int?

Fondamentalmente:

int i = 0 

è l'intero equivalente di

string myString = null; 

E se volete che il vostro int sia uso nullo:

int? i = null; 

Quindi ciò che accade è la matrice vuole almeno un elemento, non assegnerà un valore a quell'elemento. Ma poiché il valore predefinito di un intero è 0, otterrà quel valore

+0

E in azione, controlla se conta == 1 e l'elemento 0 è nullo, aggiungi errore a modelstate. –

Problemi correlati