2013-06-10 19 views
14

Ho una funzione simile nella struttura a questo:Passare un elenco di int ad una richiesta HttpGet

[HttpGet] 
public HttpResponseMessage GetValuesForList(List<int> listOfIds) 
{ 
    /* create model */   

    foreach(var id in listOfIds) 
     model.Add(GetValueForId(id) 

    /* create response for model */ 
    return response; 
} 

Tuttavia, quando faccio una richiesta GET per il metodo:

{{domain}}/Controller/GetValuesForList?listOfIds=1&listOfIds=2 

ottengo un errore durante il debug che afferma che listOfIds è nullo. Nel nostro controller abbiamo un numero di metodi pubblici HttpGet che funzionano bene, e quando si modifica il parametro in un singolo int funziona. Ho provato a cambiare il tipo di parametro su int[] e IEnumerable<int>, ma nessuna modifica.

Tuttavia, quando si modifica la chiamata a un HttpPost e si passa l'elenco come valore x-www-form-urlencoded, il metodo funziona.

È possibile passare un elenco a un metodo Get o devo utilizzare Post? Dal momento che non è in realtà un metodo post (poiché restituisce un modello di valori JSON e nulla viene salvato sul server).

+1

Dai un'occhiata a [questa risposta] (http://stackoverflow.com/a/2776855/706456). Il bit di invio sembra corretto, il bit di lettura ha bisogno di qualche ritocco. E [un altro] (http://stackoverflow.com/a/2301142/706456) dove tutto sembra essere semplice. – oleksii

+0

Avevo già tentato il secondo collegamento fornito senza fortuna, ma il primo mi ha portato a un metodo che è una combinazione di quell'URL e la risposta di @ C.B., Che ho aggiunto di seguito. Grazie – StormPooper

risposta

23

Se si utilizza MVC WebAPI, allora si può dichiarare il vostro metodo come questo:

[HttpGet] 
public int GetTotalItemsInArray([FromUri]int[] listOfIds) 
{ 
     return listOfIds.Length; 
} 

e poi la tua ricerca in questo modo: blabla.com/GetTotalItemsInArray?listOfIds=1&listOfIds=2&listOfIds=3

questo corrisponderà array [1, 2, 3 ] in listOfIds param (e restituisce 3 come previsto)

+0

Grazie, ho già visto FromUri, ma non ho mai pensato di provarlo. Risposta accettata cambiata a questo. Il collegamento – StormPooper

+0

sembra essere interrotto, sarebbe fantastico avere anche il codice client di base nell'esempio. – Jon

+0

@Jon è un link falso (blabla.com) .. ho appena dato un esempio di come l'URL dovrebbe apparire nel client. non esiste un codice specifico .. puoi usarlo con jQuery, anchor tag o plain javascript .. –

3

Ecco un trucco veloce fino a trovare una soluzione migliore:

  • uso
  • poi "listOfIds = 1,2,5,8,21,34?":
GetValuesForList(string listOfIds) 
{ 
    /* [create model] here */ 
    //string[] numbers = listOfIds.Split(','); 
    foreach(string number in listOfIds.Split(',')) 
     model.Add(GetValueForId(int.Parse(number)) 
    /* [create response for model] here */ 
    ... 
+0

Sì, spero di evitare qualsiasi conversione manuale dell'elenco, ma se nessun altro ha una risposta più ordinata preferirei farlo piuttosto che renderlo un metodo POST. Grazie – StormPooper

0

Finora ho una combinazione del commento di @oleksii e della risposta di @CB, ma utilizzando TryParse per gestire gli errori e un controllo Null per renderlo un parametro facoltativo.

var paramValues = HttpContext.Current.Request.Params.GetValues("listOfIds"); 
if (paramValues != null) 
{ 
    foreach (var id in paramValues) 
    { 
     int result; 
     if (Int32.TryParse(id, out result)) 
      model.Add(GetValueForId(Add(result)); 
     else 
      // error handling 
    } 
} 

Dal momento che i valori non sono passati da una forma ho dovuto cambiare le @oleksii risposta collegate da here da usare al posto di ParamsForms e combinati che con il suggerimento da @ C.B. per analizzare i valori stringa su int.

Mentre questo consente il tradizionale listOfIds=1&listOfIds=2, è ancora necessario convertire stringhe in int.

+0

Ho impostato questo alla mia risposta accettata, ma se qualcuno ha un modo più ordinato per farlo, per favore pubblicalo e contrassegnerò il tuo come risposta approvata. – StormPooper

+0

Vedere la risposta di @ liran-brimer per una soluzione migliore. – StormPooper

-1

È anche possibile passare l'array serializzato nella stringa di richiesta sul client e deserializzare sul lato server:

var listOfIds = [1,2,3,45]; 
var ArrlistOfIds = JSON.stringify(listOfIds); 

Per la stringa di query:

"MyMethod?listOfIds=" + ArrlistOfIds 

E poi nel lato server, basta deserializzare:

public ActionResult MyMethod(string listOfIds = null) 
{ 
    List<string> arrStatus = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<string[]>(arrStatusString).ToList(); 
    ....... 
} 

Ora avete un elenco di ID che possono essere analizzati a int.Int32.TryParse(id, out result)

Problemi correlati