将knockout.js observablearray对象传递给MVC Controller Action?

我在MVC中使用淘汰赛。 我试图将一个可观察的对象数组从敲除传递回我的MVC控制器动作以保存到数据库。 如果我通过ko.toJSON(viewModel.ArrayName)将数组从knockout传递到我的控制器操作,它在我的控制器参数中返回null。 如果我尝试通过ko.toJS(viewModel.ArrayName)将其传递给MVC,它具有正确的项目数,但由于某种原因数据为空。 如何做到这一点的任何帮助将非常感激。 谢谢!

我的JQuery数据检索方法:

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

这是问题方法:

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

我的MVC控制器数据检索操作:

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

尝试从此控制器方法的Knockout传入时,该参数返回NULL或NULL数据。

  [HttpPost] public ActionResult UpdateAccessLevels(List accessLevels) { try { foreach (AccessLevel record in accessLevels) { unitOfWork.AccessLevelRepository.Update(record); } unitOfWork.Save(); return Json("SUCCESS"); } catch (Exception ex) { return Json(ex.ToString()); } } 

下面是通过fiddler显示的JSON数据,当我传入{accessLevels:ko.toJSON(viewModel.AccessLevels)}时,它被发布到我的MVC控制器操作,控制器参数在null中使用此

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

下面是通过fiddler显示的JS数据,当我传入{accessLevels:ko.toJS(viewModel.AccessLevels)}时,它被发布到我的MVC控制器动作,在这种情况下,列表有两个成员按预期,但数据全部为null在属性中

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

如果我将一个对象传递给我的控制器它可以正常工作,但我似乎无法找出将一个对象数组从obervablearray发回到POCO实体的正确方法。

尝试通过指定正确的请求Content-Type标头将其作为JSON请求发送:

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