2009-04-09 17 views
6

Tengo un controlador definido como:Mensaje múltiples parámetros a MVC controlador utilizando 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. 

Desde mi punto de vista que estoy tratando de publicar usando jQuery como tal:

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

Sin embargo, en el controlador, obtengo nulos.


Funciona si mi Controlador toma solo 1 argumento y publico solo un objeto.

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

¿Alguna idea de cómo puedo publicar más de un objeto?

Respuesta

3

Gracias a todos por sus comentarios sobre este tema.

En esta etapa, hemos dejado de usar jquery para publicar tipos complejos en los controladores. En su lugar, usamos el marco ms ajax para hacer eso. ms ajax post muy bien enlaza los tipos complejos automáticamente de la caja.

Así que nuestra solución ahora usa una mezcla de jquery y ms ajax framework.

Ceniza

+7

¿Puedes publicar algún código de muestra o una referencia de artículo para que podamos seguir tus pasos? Estoy teniendo un problema similar o posiblemente el mismo, pero su respuesta no es tan útil como ahora, ya que necesito averiguar más específicamente de qué partes del marco ms ajax debe comenzar para tratar de avanzar. – Maslow

+0

+1 para una explicación más detallada. –

2

Su código requiere que la forma en que jquery serializa un objeto sea compatible con la carpeta de modelo predeterminada de MVC, lo cual es poco probable.

Si puede construir su objeto javascript de modo que se serialice como un objeto plano con notación de puntos (JsonAddress.Building) que funcionaría, o puede dejar que jquery realice la serialización predeterminada y luego crear un clasificador de modelo personalizado para deserializar a los tipos de parámetros de acción.

3

Tenga en cuenta que la "serialización predeterminada" que jQuery está haciendo aquí no va a funcionar sin importar lo que haga su controlador. jQuery no "recorrer" el mapa de parámetros debajo del primer nivel, por lo que el ejemplo en la pregunta es probable generando estos datos mensaje:

address=[object]&geoLocation=[object] 

El otro, ejemplo de trabajo no contiene ningún sub-objetos, por lo que está siendo traducido directamente como aquí: 'Dirección'

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

la solución más fácil es hacer el mapa de parámetros plana, cada tecla con el prefijo ya sea o 'GeoLocation.', dependiendo.

0

Tuve el mismo problema y no conseguí que nada funcionara. También alguien lo planteó como un error con jquery y lo cerraron como un error.

He encontrado algunas soluciones que responden en parte a toda la pregunta. Y la respuesta incluye lo siguiente.

1) Lado del cliente: tendríamos que codificar todos los objetos que necesita enviar. Esto podría ser un objeto normal o una matriz. Funciona en ambos.

2) Lado del cliente: envía los datos como lo hizo en la primera publicación. Como lo haría objeto por objeto.

Consejo: Cuando envía objetos parametrizados, jquery codifica los datos enviados al servidor.

Después de todo son implementaciones del lado del servidor 1) deserializador clase: que tendrá la cadena de entrada y poner de nuevo en objetar/lista <>/IList <> lo que cada vez que haya definido como tipo de datos del parámetro del controlador función. Debería implementar ActionFilterAttribute para lo anterior.

2) Finalmente agregue un atributo a la función del controlador, de modo que use la clase del deserializador para obtener los parámetros.

Como este es un montón de código, avíseme si necesita detalles o si ha resuelto el problema.

Deepak Chawla

Cuestiones relacionadas