2012-12-19 10 views
6

Ho un progetto netapi .net mvc 4 che sto cercando di passare un array di un oggetto a un metodo sul mio controller.passa array di un oggetto a webapi

Ho trovato alcuni esempi qui su SO che parlano di dover impostare le proprietà del mio oggetto con: param1 = qualunque & param2 = bling & param3 = blah.

Ma non vedo come posso passare in una raccolta usando quello.

Ecco la mia firma del metodo. Si noti che ho decorato l'argomento con l'attributo [FromUri].

public List<PhoneResult> GetPhoneNumbersByNumbers([FromUri] PhoneRequest[] id) 
{ 
    List<PhoneResult> prs = new List<PhoneResult>(); 
    foreach (PhoneRequest pr in id) 
    { 
     prs.Add(PhoneNumberBL.GetSinglePhoneResult(pr.PhoneNumber, pr.RfiDate, pr.FinDate, pr.State)); 
    } 
    return prs; 
} 

qui è la mia semplice oggetto PhoneRequest:

public class PhoneRequest 
{ 
    public string PhoneNumber { get; set; } 
    public string RfiDate { get; set; } 
    public string FinDate { get; set; } 
    public string State { get; set; } 
} 

ed ecco un esempio di quello che sto usando per passare:

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers/ 
    [{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"}, 
    {"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}] 

utilizzare questo torna con "Bad Request "

Ho provato anche questo

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers? 
    id=[{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"}, 
     {"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}] 

che raggiunge il metodo, ma l'array è nullo.

Come posso passare un array del mio oggetto PhoneRequest al mio metodo API Web?

+0

Come ho menzionato in un [commento] (http://stackoverflow.com/questions/13962748/pass-array-of-an-object-to-webapi/13963155#comment28579974_13963155) a @Maggie Ying's [risposta] (http://stackoverflow.com/a/13963155/326110), il nome del metodo ('getphonenumbersbynumbers') dovrebbe ** non ** essere parte dell'URL in API Web ASP.NET. Invece, il metodo da usare è determinato tipicamente dal verbo HTTP. Vedere [Routing in ASP.NET Web API] (http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api) –

risposta

7

Prova a passare il PhoneRequest [] dal uri in questo formato:

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers? 
    id[0][PhoneNumber]=8016667777&id[0][FinDate]=2012-02-11&id[0][State]=UT& 
    id[1][PhoneNumber]=8018889999&id[1][RfiDate]=2012-12-01&id[1][State]=UT 
+0

sfortunatamente quando Ho inserito un punto di interruzione nella firma del metodo, l'ID è ancora in arrivo come null. Altre idee? –

+0

Interessante, sono stato in grado di ottenere questo modello per il bind corretto ... Hai provato a semplificare l'url un po '(dì solo?? Id [0] [State] = UT') e vedi se ottieni ancora nulla? –

+0

Ho provato tutti i tipi di diverse stringhe di URL. Ho finito per usare jquery.ajax() per passarlo per farlo legare correttamente.Sono sicuro che le persone che consumano il servizio possano conviverci. Abbastanza sicuro che sia stato qualcosa che ho sbagliato nell'esempio che hai fornito perché ho letto molte altre risorse che mi hanno detto di fare la stessa cosa che hai delineato, quindi lo contrassegnerò come corretto ... grazie. –

5

vi suggerisco di utilizzare POST per questo.

Man mano che si interroga la stringa, si verificheranno problemi con la lunghezza massima dell'URL, che dipende dal browser.

Se si superano molti parametri, un POST è perfettamente accettabile anche se si stanno solo ottenendo dati. Ciò che si perderà, tuttavia, è la possibilità per l'utente di aggiungere un segnalibro a una pagina particolare con la stringa di query.

+0

In relazione alla mancanza di supporto per il bookmarking, la modifica di 'GET's a' POST's impedisce anche l'utilizzo di banali test/usando l'endpoint all'interno di un browser. Avranno bisogno di creare una richiesta 'POST' in qualche modo. A volte questo è conveniente e spesso desiderato. –

0

Ho creato un modello personalizzato legatore, la classe FieldValueModelBinder, che può effettivamente passare qualsiasi oggetto contenente array nidificato o tipi di elenchi generici di dati con stringhe di query aventi coppie nome-campo senza inserire alcuna struttura JSON e XML. Il modello legante può risolvere tutti i problemi discussi sopra. Poiché questa domanda è stata estesa dall'ID domanda 19302078, puoi vedere i dettagli della mia risposta in quel thread.

Problemi correlati