2012-10-11 70 views
13

Estoy usando knockout con MVC. Estoy tratando de pasar una matriz observable de objetos desde el knockout a mi acción de controlador MVC para guardarlos en la base de datos. Si paso el Array de knockout a mi acción de controlador a través de ko.toJSON (viewModel.ArrayName), vuelve a ser nulo en mi parámetro de controlador. Si trato de pasarlo a MVC a través de ko.toJS (viewModel.ArrayName), tiene la cantidad correcta de elementos, pero los datos son nulos por alguna razón. Cualquier ayuda sobre cómo hacer esto sería muy apreciada. ¡Gracias!Pasando el objeto observablearray knockout.js a MVC Controller Action?

Mi jQuery recuperación de datos Método:

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

Este es el método problema:

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

Mi acción MVC controlador de recuperación de datos:

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

El parámetro regresa NULL o con datos NULL al intentar pasarlo desde Knockout en este método de controlador.

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

A continuación se muestra los datos JSON que se muestran a través de eso violinista ser enviado a mi acción del controlador MVC cuando paso en {accessLevels: ko.toJSON (viewModel.AccessLevels)} los parámetros de regulación está llegando en el uso de este nula

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

a continuación se muestran los datos a través de JS violinista eso es ser publicado a mi acción del controlador MVC cuando paso en {accessLevels: ko.toJS (viewModel.AccessLevels)}, en este caso, la lista tiene dos miembros como se esperaba, pero los datos son nulos en el pro piedades

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

Si paso en un solo objeto a mi controlador funciona muy bien, pero me parece que no puede averiguar la forma correcta de colocar una matriz de objetos a mi controlador de un obervablearray de nuevo a un POCO entidad.

+1

¿Cuál es la forma de la JSON que está siendo publicado? Use el depurador para obtener esto o use [Fiddler] (http://www.fiddler2.com/fiddler2/version.asp) para capturarlo, luego actualice su publicación con esta información. ¡Gracias! –

+0

He editado mis preguntas anteriores con la información solicitada. – ccorrin

+0

No sé cómo ASP.net maneja las asignaciones, pero está pasando una cadena a su publicación ('ko.toJSON()' devuelve una cadena). ¿No debería ser eso una matriz? ¿No deberías estar usando 'ko.toJS()'? –

Respuesta

9

Trate de enviarlo como una solicitud JSON especificando el encabezado de solicitud Content-Type correcta:

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

Esto funcionó perfectamente. Gracias. Entonces, tratando de entender esto, ¿por qué salió como nulo sin especificar manualmente el tipo de contenido? – ccorrin

+0

Porque está enviando cadena JSON y no ha especificado el tipo de contenido. La carpeta de modelo predeterminada no tiene ninguna pista sobre cómo vincularla.Podrías haber pasado '{accessLevels: viewModel.AccessLevels}' sin llamar a ningún 'ko.toJSON' pero esto hubiera funcionado solo con los tipos primitivos dentro de la matriz. Con tipos más complejos, es mejor usar una solicitud JSON. –

+0

Eso tiene sentido, ya que cuando envío un elemento en lugar de una matriz funcionó bien. Gracias, Darin. – ccorrin

Cuestiones relacionadas