2012-03-26 32 views
6

Estoy tratando de pasar los datos de un formulario a mi método de controlador usando JQuery Ajax, pero no estoy seguro de cómo hacerlo ya que mi ViewModel es nulo cuando uso depurador en el Lado del controladorMVC3 Pasando ViewModel al método del controlador usando JQuery Ajax

Mi modelo de vista es:

public class PremisesViewModel 
{ 

    public string createPremisesErrorMessage { get; set; } 
    public string updatePremisesErrorMessage { get; set; } 

    public SelectList listOfCounties = Initialise.countiesSelectList; 

    public Premise premises { get; set; } 
} 

donde los locales es una entidad/mesa en mi base de datos.

el formulario contiene los campos de la tabla Local.

En mi función de JavaScript hago esto:

var premisesViewModel = { 
           Id: 0, 
           PremisesDescription: $('#premises_PremisesDescription').val(), 
           OrdnanceSurveyReference: $('#premises_OrdnanceSurveyReference').val(), 
           PartRestrictedNotes: $('#premises_PartRestrictedNotes').val(), 
           NatureOfPremises: $('#premises_NatureOfPremises').val(), 
           AddressLine1: $('#premises_AddressLine1').val(), 
           AddressLine2: $('#premises_AddressLine2').val(), 
           Town: $('#premises_Town').val(), 
           CountyId: $('#premises_CountyId').val(), 
           Postcode: $('#premises_Postcode').val() 
          } 
    alert(form.serialize); 
    $.ajax({ 
     url: form.attr('action'), 
     type: 'POST', 
     dataType: "json", 
     contentType: 'application/json', 
     data: JSON.stringify(premisesViewModel), 
     success: function (data) { 
      alert('done'); 
     } 
    }) 

Sin embargo, al comprobar el parámetro de modelo de vista en mi método, es nulo:

[HttpPost] 
    public JsonResult Create(PremisesViewModel pvm) 
    { 
     return null; 
    } 

Cualquier ideas sobre cómo asignar este modo que el modelo de vista está ligado correctamente. Gracias

+0

Si utiliza quemador, y la mira a la solicitud posterior, no se envía los datos correctos a la página Crear? –

Respuesta

5

Su formato JSON exactamente iguales que su clase del modelo.

ejemplo actual

public class PremisesViewModel 
{ 

    public string createPremisesErrorMessage { get; set; } 
    public string updatePremisesErrorMessage { get; set; } 

    public SelectList listOfCounties = Initialise.countiesSelectList; 

    public Premise premises { get; set; } 
} 

Su JSON como

var premisesViewModel = { 
            createPremisesErrorMessage : $('#premises_PremisesDescription').val(), 
            updatePremisesErrorMessage: $('#premises_OrdnanceSurveyReference').val(),  
            premises : {Define more properties here as per your Premise structure} 
           } 
+0

Modificado como sugirió y funciona como un regalo. Gracias por el código en profundidad ya que esto me lo dejó mucho más claro. – user1079925

4

Los nombres de las variables en los datos que está publicando no se corresponden con los nombres de las propiedades de su ASP.Net MVC ViewModel, por lo que los datos no se pueden enlazar correctamente.

5

Si usted quiere construir automáticamente el modelo de la vista del modelo consolidado de un formulario, puede utilizar el código de esta respuesta https://stackoverflow.com/a/1186309 a serializar correctamente a un objeto JSON.

Se podría entonces tiene que pasar como una cadena a su llamada $ .ajax. En general, muy similar a lo que originalmente tenías. Algo así como:

var premisesViewModel = $('form').serializeObject(); 
$.ajax({ 
     url: form.attr('action'), 
     type: 'POST', 
     dataType: "json", 
     contentType: 'application/json', 
     data: JSON.stringify(premisesViewModel), 
     success: function (data) { 
      alert('done'); 
     } 
    }); 

bastante extraño que no hay función básica para convertir a un objeto JSON, pero hay que ir.

Cuestiones relacionadas