14

MVCでノックアウトを使用しています。データベースに保存するために、オブジェクトの監視可能な配列をノックアウトから MVC コントローラー アクションに戻そうとしています。ko.toJSON(viewModel.ArrayName) を介してノックアウトからコントローラー アクションに配列を渡すと、コントローラー パラメーターで null として返されます。ko.toJS(viewModel.ArrayName) を介して MVC に渡そうとすると、正しい数の項目がありますが、何らかの理由でデータが null です。これを行う方法についての助けをいただければ幸いです。ありがとう!

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

以下は、{ accessLevels: ko.toJSON(viewModel.AccessLevels) } を渡すと、私の MVC コントローラー アクションに投稿されるフィドラーを介して表示される JSON データです。これを使用して、コントローラー パラメーターが null になります。

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

以下は、{ accessLevels: ko.toJS(viewModel.AccessLevels) } を渡すと MVC コントローラー アクションにポストされるフィドラーを介して表示される JS データです。この場合、リストには予想どおり 2 つのメンバーがありますが、データはすべて null です。プロパティで

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

単一のオブジェクトをコントローラーに渡すと問題なく動作しますが、オブジェクトの配列をコントローラーに obevablearray から POCO エンティティに戻す適切な方法がわかりません。

4

1 に答える 1

13

正しいリクエスト 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);
        }
    });
};
于 2012-10-12T13:52:51.877 に答える