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

时间:2012-10-11 19:01:40

标签: javascript jquery asp.net-mvc knockout.js

我在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<AccessLevel> 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控制器动作,控制器参数使用此

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

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

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

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

1 个答案:

答案 0 :(得分:11)

尝试通过指定正确的请求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);
        }
    });
};