2009-04-09 11 views
6

Ich habe einen Controller wie folgt definiert:Beitrag mehrere Parameter MVC-Controller mit 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. 

Aus meiner Sicht Ich versuche, mit jQuery als solche zu schreiben:

 
     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"); 
     } 

jedoch Auf dem Controller bekomme ich Nullen.


Es funktioniert, wenn mein Controller nur 1 Argument und ich poste nur ein Objekt.

 
     [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"); 
     } 

Irgendwelche Ideen, wie ich mehr als ein Objekt veröffentlichen können?

Antwort

3

Vielen Dank an alle für Ihre Eingabe zu diesem Thema.

In diesem Stadium haben wir uns davon entfernt, jquery zu verwenden, um komplexe Typen an Controller zu senden. Stattdessen verwenden wir das ms Ajax-Framework, um das zu tun. ms ajax post bindet die komplexen Typen automatisch automatisch aus der Box.

So verwendet unsere Lösung jetzt eine Mischung aus JQuery und ms Ajax Framework.

Ash

+7

können Sie einen Beispielcode oder eine Artikelreferenz veröffentlichen, damit wir Ihren Fußspuren folgen können? Ich habe ein ähnliches oder möglicherweise das gleiche Problem, aber Ihre Antwort ist nicht annähernd so hilfreich, wie ich jetzt genauer herausfinden muss, welche Teile des ms Ajax-Frameworks bei dem Versuch, voranzukommen, beginnen. – Maslow

+0

+1 für weitere Erläuterungen. –

2

Ihr Code erfordert, dass die Art, wie jquery ein Objekt serialisiert, mit dem MVC-Standardmodellbinder kompatibel ist, was ich für unwahrscheinlich halte.

Wenn Sie Ihr JavaScript-Objekt so erstellen können, dass es als ein flaches Objekt mit Punktnotation (JsonAddress.Building) serialisiert, das funktionieren könnte, oder Sie können jquery die Standardserialisierung durchführen lassen und dann ein benutzerdefiniertes Modellbinderverzeichnis erstellen die Aktionsparametertypen.

3

Beachten Sie, dass die "Standardserialisierung", die jQuery hier ausführt, nicht funktioniert, egal was Ihr Controller tut. jQuery nicht „durchqueren“, um die Parameter der Karte unter der ersten Ebene, so dass das Beispiel in der Frage wahrscheinlich erzeugt diese Daten Beitrag:

address=[object]&geoLocation=[object] 

Das andere Arbeitsbeispiel enthält keine Unterobjekte, so dass es direkt, wie dies übersetzt wird: ‚Adresse‘

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

die einfachste Lösung der Parameterkarte flach macht, jede Taste mit dem Präfix entweder oder 'GeoLocation.', abhängig.

0

Ich hatte das gleiche Problem und konnte nichts zum Arbeiten bekommen. Auch jemand hat es als Bug mit jQuery angesprochen und sie haben es als keinen Bug geschlossen.

Ich habe ein paar Lösungen gefunden, die einen Teil der ganzen Frage beantworten. Und die Antwort enthält Folgendes.

1) Client-Seite: Wir müssten alle Objekte, die Sie senden möchten, stringyfy. Dies könnte ein normales Objekt oder ein Array sein. Es funktioniert auf beiden.

2) Client-Seite: Sie senden die Daten wie im ersten Beitrag. Wie Sie Objekt für Objekt ablehnen würden.

Tipp: Wenn Sie parametrisierte Objekte senden, codiert jquery die an den Server gesendeten Daten.

Im Anschluss an alle sind serverseitige Implementierungen 1) Deserializer Klasse: welche die Eingabezeichenfolge nehmen und es in setzen zurück zum Objekt/Liste <>/IList <> was auch immer Sie als Datentyp des Parameters des Reglers festgelegt hat Funktion. Sie müssten ActionFilterAttribute für das oben genannte implementieren.

2) Schließlich ein Attribut zur Controller-Funktion hinzufügen, so dass es die Deserialiser-Klasse verwendet, um die Parameter zu erhalten.

Da dies eine Menge Code ist, lassen Sie mich wissen, wenn Sie Details benötigen oder das Problem gelöst haben.

Deepak Chawla