2012-03-26 10 views
6

Sto provando a passare i dati di un modulo al mio metodo controller usando JQuery Ajax, ma non sono sicuro di come lo si faccia perché il mio ViewModel è nullo quando uso il debugger sul Controller Side.MVC3 Passa ViewModel al metodo controller usando JQuery Ajax

mio ViewModel è:

public class PremisesViewModel 
{ 

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

    public SelectList listOfCounties = Initialise.countiesSelectList; 

    public Premise premises { get; set; } 
} 

cui locali è un'entità/tabella nel mio database.

Il modulo contiene i campi nella tabella Locali.

Nella mia funzione javascript faccio questo:

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

Tuttavia, quando controllo il parametro ViewModel nel mio metodo, è nullo:

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

Tutte le idee su come mappare questo modo che il viewmodel è legato correttamente. Grazie

+0

Se si utilizza firebug e si guarda la richiesta di posta, invia i dati corretti alla pagina Crea? –

risposta

5

Il tuo formato JSON è esattamente lo stesso della classe del tuo modello.

esempio attuale

public class PremisesViewModel 
{ 

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

    public SelectList listOfCounties = Initialise.countiesSelectList; 

    public Premise premises { get; set; } 
} 

tuo JSON come

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

Modificato come suggerito e funziona bene. Grazie per il codice approfondito che mi ha reso molto più chiaro. – user1079925

4

I nomi delle variabili nei dati che stai postando non corrispondono ai nomi delle proprietà del tuo ASP.Net MVC ViewModel, quindi i dati non possono essere vincolati correttamente.

5

Se si voleva costruire automaticamente il modello dal punto di vista del modello legato di un modulo, è possibile utilizzare il codice da questa risposta https://stackoverflow.com/a/1186309 a serializzare correttamente su un oggetto JSON.

Dovresti quindi passarlo come stringa alla chiamata $ .ajax. Tutto sommato, molto simile a quello che avevi in ​​origine. Qualcosa di simile:

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

piuttosto strano che non c'è alcuna funzione di base da convertire in un oggetto JSON, ma ci si va.

Problemi correlati