传递knockout.js observablearray反对MVC控制器动作? [英] Passing knockout.js observablearray object to MVC Controller Action?

查看:161
本文介绍了传递knockout.js observablearray反对MVC控制器动作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

即时通讯使用淘汰赛与MVC。我试着去从淘汰赛回到我的MVC控制器动作传递对象的可观察的数组保存到数据库中。如果我通过基因敲除的阵列上通过ko.toJSON(viewModel.ArrayName)我控制器操作它在我的控制器参数回来为空。如果我试着通过ko.toJS(viewModel.ArrayName)将它传递给MVC有项目的正确数目,但数据是空的某些原因。如何做到这一点任何帮助将是greeatly AP preciated。谢谢!

我的JQuery的数据检索方式:

  VAR的DataService = {};
VAR视图模型;$(文件)。就绪(函数(){
    dataService.getAccessLevelList();
})dataService.getAccessLevelList =功能(){
    .post的$('/的DataService / GetAccessLevelList',NULL,功能(数据){
        视图模型= ko.mapping.fromJS(数据);
        ko.applyBindings(视图模型);
    });
}

这就是问题的方法:

  updateAccessLevels =功能(){
    .post的$('/的DataService / UpdateAccessLevels',{accessLevels:ko.toJSON(viewModel.AccessLevels)},功能(状态){
        警报(状态);
    });
}

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

  [HttpPost]
    公众的ActionResult GetAccessLevelList()
    {
        FacilityAccessViewModel视图模型=新FacilityAccessViewModel();
        viewModel.AccessLevels = unitOfWork.AccessLevelRepository.Get()了ToList()。
        返回JSON(视图模型);
    }

参数是回来了NULL或试图从淘汰赛在传递这个控制器方法时NULL数据。

  [HttpPost]
    公众的ActionResult UpdateAccessLevels(列表<&ACCESSLEVEL GT; accessLevels)
    {
        尝试
        {
            的foreach(在accessLevels ACCESSLEVEL记录)
            {
                unitOfWork.AccessLevelRepository.Update(记录);
            }            unitOfWork.Save();
            返回JSON(成功);
        }
        赶上(异常前)
        {
            返回JSON(ex.ToString());
        }
    }

以下是通过小提琴手显示,多数民众赞成JSON数据被贴到我的MVC控制器动作,当我通过{accessLevels:ko.toJSON(viewModel.AccessLevels)}控制器参数,使用这个

<$p$p><$c$c>[{\"Access\":[],\"Id\":1,\"AccessLevelDesc\":\"TEST222\"},{\"Access\":[],\"Id\":2,\"AccessLevelDesc\":\"TEST222\"}]

以下是通过小提琴手这就是显示的JS数据被贴到我的MVC控制器动作,当我通过{accessLevels:ko.toJS(viewModel.AccessLevels)},在这种情况下列表中有两个成员如预期,但数据的属性都为空

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

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


解决方案

尝试通过指定正确的请求Content-Type头发送它作为一个JSON请求:

  updateAccessLevels =功能(){
    $阿贾克斯({
        网址:'/的DataService / UpdateAccessLevels',
        输入:POST,
        的contentType:应用/ JSON的;字符集= UTF-8,
        数据:ko.toJSON(viewModel.AccessLevels)
        成功:功能(状态){
            警报(状态);
        }
    });
};

Im using knockout with MVC. Im trying to pass an observable array of objects from knockout back to my MVC controller action for saving to the database. If I pass the Array from knockout over to my controller action via ko.toJSON(viewModel.ArrayName) it comes back as null in my controller parameter. If I try to pass it to MVC via ko.toJS(viewModel.ArrayName) it has the correct number of items but the data is null for some reason. Any help on how to do this would be greeatly appreciated. Thanks!

My JQuery Data Retrieval Method:

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

This is the problem method:

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

My MVC Controller Data Retrieval action:

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

The parameter is coming back NULL or with NULL data when trying to pass it in from Knockout on this controller method.

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

Below is the JSON data shown via fiddler thats being posted to my MVC controller action when i pass in { accessLevels: ko.toJSON(viewModel.AccessLevels) } the controller parameter is coming in null using this

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

Below is the JS data shown via fiddler thats being posted to my MVC controller action when i pass in { accessLevels: ko.toJS(viewModel.AccessLevels) }, in this case the list has two members as expected, but the data is all null in the properties

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

If I pass in a single object to my controller it works just fine, but I cant seem to figure out the proper way to post an array of objects to my controller from an obervablearray back to a POCO entity.

解决方案

Try sending it as a JSON request by specifying the correct request Content-Type header:

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

这篇关于传递knockout.js observablearray反对MVC控制器动作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆