2009-04-09 15 views
6

ho un controller definito come:post più parametri a MVC controller utilizzando jQuery.post

 
     [AcceptVerbs(HttpVerbs.Post)] 
     public JsonResult PostMoreData(DataContracts.Address address, DataContracts.GeoLocation geoLocation) 
     { 
      return Json("test"); 
     } 

where DataContracts.Address and DataContracts.GeoLocation are complex types. 

Dal mio punto di vista che sto cercando di inviare utilizzando jQuery in quanto tale:

 
     function PostMoreData() { 

      var JsonAddress = { 

       "Building": $('Building').val(), 
       "UnitNumber": $('UnitNumber').val(), 
       "StreetNumber": $('StreetNumber').val(), 
       "StreetName": $('StreetName').val(), 
       "StreetType": $('StreetType').val(), 
       "Suburb": $('Suburb').val(), 
       "State": $('State').val(), 
       "Postcode": $('Postcode').val(), 
       "MonthsAtAddress": $('MonthsAtAddress').val() 

      }; 

      var JsonGeoLocation = { 
       "Latitude": $('Latitude').val(), 
       "Longitude": $('Longitude').val() 
      }; 


      jQuery.post("/AddressValidation/PostMoreData", {address: JsonAddress, geoLocation: JsonGeoLocation}, function(data, textStatus) { 
       if (textStatus == "success") { 
        var result = eval(data); 
        if (result.length > 0) { 
         alert(result); 
        } 
       } 
      }, "json"); 
     } 

Tuttavia, sul controller, ottengo null.


Funziona se il mio controllore richiede solo 1 argomento e inserisco solo un oggetto.

 
     [AcceptVerbs(HttpVerbs.Post)] 
     public JsonResult PostMoreData(DataContracts.Address address) 
     { 
      return Json("test"); 
     } 
 
     function PostMoreData() { 

      var JsonAddress = { 

       "Building": $('Building').val(), 
       "UnitNumber": $('UnitNumber').val(), 
       "StreetNumber": $('StreetNumber').val(), 
       "StreetName": $('StreetName').val(), 
       "StreetType": $('StreetType').val(), 
       "Suburb": $('Suburb').val(), 
       "State": $('State').val(), 
       "Postcode": $('Postcode').val(), 
       "MonthsAtAddress": $('MonthsAtAddress').val() 

      }; 


      jQuery.post("/AddressValidation/PostMoreData", JsonAddress, function(data, textStatus) { 
       if (textStatus == "success") { 
        var result = eval(data); 
        if (result.length > 0) { 
         alert(result); 
        } 
       } 
      }, "json"); 
     } 

Tutte le idee come posso postare più di un oggetto?

risposta

3

Grazie a tutti per il vostro contributo su questo tema.

In questa fase, ci siamo allontanati dall'utilizzo di jquery per inviare tipi complessi ai controller. Invece usiamo il framework ms ajax per farlo. ms ajax post lega bene i tipi complessi automaticamente fuori dalla scatola.

Quindi la nostra soluzione ora utilizza un mix di framework jquery e ms ajax.

Cenere

+7

puoi pubblicare qualche codice di esempio o un riferimento a un articolo in modo che possiamo seguire le tue orme? Sto avendo un problema simile o forse lo stesso, ma la tua risposta non è così utile come ora ho bisogno di capire in modo più specifico quali parti del framework ms ajax iniziare nel tentativo di andare avanti. – Maslow

+0

+1 per ulteriori spiegazioni. –

2

Il codice richiede che il modo in cui jquery serializza un oggetto sia compatibile con il raccoglitore modello predefinito MVC, che a mio avviso è improbabile.

Se è possibile creare l'oggetto javascript in modo che si serializzi come un oggetto piatto con notazione punto (JsonAddress.Building) che funzionerebbe, oppure è possibile lasciare che jquery esegua la serializzazione predefinita e quindi creare un raccoglitore modello personalizzato per deserializzare in i tipi di parametro azione.

3

Si noti che la "serializzazione predefinita" che jQuery sta facendo qui non funzionerà, indipendentemente dal controller. jQuery non "attraversare" mappa parametro di sotto del primo livello, quindi l'esempio in questione è probabile generando questi dati postale:

address=[object]&geoLocation=[object] 

L'altro esempio di lavoro non contiene oggetti secondari, quindi viene tradotto direttamente, in questo modo:

Building=value&UnitNumber=value&...&MonthsAtAddress=value 

la soluzione più semplice è fare la mappa parametri piatta, ogni tasto prefisso con 'Indirizzo.' o 'GeoLocation.', a seconda.

0

Ho avuto lo stesso problema e non riuscivo a far funzionare nulla. Anche qualcuno lo ha sollevato come un bug con jquery e lo hanno chiuso come un bug.

Ho trovato alcune soluzioni che rispondono a parte dell'intera domanda. E la risposta include quanto segue.

1) Lato client: dovremmo stringere con stringimento tutti gli oggetti che è necessario inviare. Questo potrebbe essere un oggetto normale o un array. Funziona su entrambi.

2) Lato client: si inviano i dati come si hanno nel primo post. Come obiettieresti per oggetto.

Suggerimento: quando si inviano oggetti parametrizzati, jquery codifica i dati inviati al server.

Dopo tutto sono le implementazioni lato server 1) Deserializer classe: che avrà la stringa di input e rimetterlo in obiettare/Lista <>/IList <> che cosa mai si è definito come tipo di dati del parametro del regolatore funzione. È necessario implementare ActionFilterAttribute per quanto sopra.

2) Infine aggiungere un attributo alla funzione controller, in modo che utilizzi la classe deserializzatore per ottenere i parametri.

Poiché questo è un bel po 'di codice fammi sapere se hai bisogno di dettagli o hai risolto il problema.

Deepak Chawla

Problemi correlati