2012-10-11 14 views
13

Im utilizzando knockout con MVC. Sto cercando di passare una serie osservabile di oggetti dal knockout all'azione del mio controller MVC per salvarli nel database. Se passerò l'array da knockout all'azione del mio controller tramite ko.toJSON (viewModel.ArrayName) tornerà come null nel parametro del mio controller. Se provo a passarlo a MVC tramite ko.toJS (viewModel.ArrayName) ha il numero corretto di elementi ma i dati sono nulli per qualche motivo. Qualsiasi aiuto su come farlo sarebbe apprezzato in maniera grezza. Grazie!Passaggio di oggetto observablearray knockout.js all'azione del controller MVC?

mio JQuery di reperimento dei dati Metodo:

var dataService = {}; 
var viewModel; 

$(document).ready(function() { 
    dataService.getAccessLevelList(); 
}) 

dataService.getAccessLevelList = function() { 
    $.post('/DataService/GetAccessLevelList', null, function (data) { 
     viewModel = ko.mapping.fromJS(data); 
     ko.applyBindings(viewModel); 
    }); 
} 

Questo è il metodo problema:

updateAccessLevels = function() { 
    $.post('/DataService/UpdateAccessLevels', { accessLevels: ko.toJSON(viewModel.AccessLevels) }, function (status) { 
     alert(status); 
    }); 
} 

mia azione MVC controller di reperimento dei dati:

[HttpPost] 
    public ActionResult GetAccessLevelList() 
    { 
     FacilityAccessViewModel viewModel = new FacilityAccessViewModel(); 
     viewModel.AccessLevels = unitOfWork.AccessLevelRepository.Get().ToList(); 
     return Json(viewModel); 
    } 

Il parametro restituisce NULL o con dati NULL quando tenta di passarlo da Knockout su questo metodo di controller.

[HttpPost] 
    public ActionResult UpdateAccessLevels(List<AccessLevel> accessLevels) 
    { 
     try 
     { 
      foreach (AccessLevel record in accessLevels) 
      { 
       unitOfWork.AccessLevelRepository.Update(record); 
      } 

      unitOfWork.Save(); 
      return Json("SUCCESS"); 
     } 
     catch (Exception ex) 
     { 
      return Json(ex.ToString()); 
     } 
    } 

Di seguito i dati JSON mostrati tramite questo è violinista di essere inviati ad mia MVC azione di controllo quando passo in {accessLevels: ko.toJSON (viewModel.AccessLevels)} il parametro di controllo è in arrivo nel nulla con questo

[{"Access":[],"Id":1,"AccessLevelDesc":"TEST222"},{"Access":[],"Id":2,"AccessLevelDesc":"TEST222"}] 

Qui di seguito sono i dati JS mostrati tramite violinista questo è di essere pubblicati alla mia MVC azione di controllo quando passo in {accessLevels: ko.toJS (viewModel.AccessLevels)}, in questo caso la lista ha due membri come previsto, ma i dati sono tutti nulli nel pro prietà

accessLevels[0][Id] 1 
accessLevels[0][AccessLevelDesc] TEST222 
accessLevels[1][Id] 2 
accessLevels[1][AccessLevelDesc] TEST222 

Se mi passa in un unico oggetto al mio controller funziona bene, ma non posso sembra di capire il modo corretto per inviare un array di oggetti per il mio controller da un obervablearray di nuovo ad un POCO entità.

+1

Qual è la forma del JSON che viene pubblicato? Utilizza il debugger per ottenere questo o usa [Fiddler] (http://www.fiddler2.com/fiddler2/version.asp) per catturarlo, quindi aggiorna il tuo post con queste informazioni. Grazie! –

+0

Modificato le mie domande sopra con le informazioni richieste. – ccorrin

+0

Non so come ASP.net gestisca i mapping ma si passa una stringa al proprio post ('ko.toJSON()' restituisce una stringa). Non dovrebbe essere un array? Non dovresti usare 'ko.toJS()'? –

risposta

9

Prova inviarlo come una richiesta JSON specificando la corretta intestazione della richiesta Content-Type:

updateAccessLevels = function() { 
    $.ajax({ 
     url: '/DataService/UpdateAccessLevels', 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     data: ko.toJSON(viewModel.AccessLevels), 
     success: function(status) { 
      alert(status); 
     } 
    }); 
}; 
+0

Questo ha funzionato perfettamente. Grazie. Quindi, cercando di capirlo, perché è arrivato come nulla senza specificare manualmente il tipo di contenuto? – ccorrin

+0

Poiché si sta inviando una stringa JSON e non si è specificato il tipo di contenuto. Il modello predefinito di legatura non ha assolutamente alcun indizio su come legarlo.Potresti aver passato '{accessLevels: viewModel.AccessLevels}' senza chiamare 'ko.toJSON' ma questo avrebbe funzionato solo con i tipi primitivi all'interno dell'array. Con tipi più complessi è meglio usare una richiesta JSON. –

+0

Questo ha senso, poiché quando invio un elemento anziché un array, ha funzionato correttamente. Grazie, Darin. – ccorrin

Problemi correlati