Asp.net mvc 4 发布淘汰赛数据时MVC模型绑定器问题

Asp.net mvc 4 发布淘汰赛数据时MVC模型绑定器问题,asp.net-mvc-4,knockout.js,Asp.net Mvc 4,Knockout.js,我有一个击倒模型,我正试图张贴到MVC4控制器。简化版本如下所示: var ItemModel = function (id, name) { var self = this; self.id = ko.observable(id); self.name = ko.observable(name); }; var Entry = function () { var self = this; self.Id = ko.observable();

我有一个击倒模型,我正试图张贴到MVC4控制器。简化版本如下所示:

var ItemModel = function (id, name) {
    var self = this;

    self.id = ko.observable(id);
    self.name = ko.observable(name);
};

var Entry = function () {
    var self = this;

    self.Id = ko.observable();
    self.areas = ko.observableArray([]);
};

var EntryModel = function () {
    var self = this;

    self.entry = new Entry();

    self.save = function () {
        $.post("/Edit", ko.toJS(self.entry), function (data) {
            ...
        })};
    };
};
viewModel.entry.areas.push(new ItemModel(1, "A"));
viewModel.entry.areas.push(new ItemModel(2, "B"));
id = 1
name = test
area[0][id] = 1
area[0][name] = "A"
area[1][id] = 2
area[1][name] = "B"
如果向模型中添加两个区域,如下所示:

var ItemModel = function (id, name) {
    var self = this;

    self.id = ko.observable(id);
    self.name = ko.observable(name);
};

var Entry = function () {
    var self = this;

    self.Id = ko.observable();
    self.areas = ko.observableArray([]);
};

var EntryModel = function () {
    var self = this;

    self.entry = new Entry();

    self.save = function () {
        $.post("/Edit", ko.toJS(self.entry), function (data) {
            ...
        })};
    };
};
viewModel.entry.areas.push(new ItemModel(1, "A"));
viewModel.entry.areas.push(new ItemModel(2, "B"));
id = 1
name = test
area[0][id] = 1
area[0][name] = "A"
area[1][id] = 2
area[1][name] = "B"
然后使用
viewModel.save
I从模型绑定器中获得两个区域,但其中没有数据(即id=0,name=“”)

经过一些研究,我发现我发布的数据如下:

var ItemModel = function (id, name) {
    var self = this;

    self.id = ko.observable(id);
    self.name = ko.observable(name);
};

var Entry = function () {
    var self = this;

    self.Id = ko.observable();
    self.areas = ko.observableArray([]);
};

var EntryModel = function () {
    var self = this;

    self.entry = new Entry();

    self.save = function () {
        $.post("/Edit", ko.toJS(self.entry), function (data) {
            ...
        })};
    };
};
viewModel.entry.areas.push(new ItemModel(1, "A"));
viewModel.entry.areas.push(new ItemModel(2, "B"));
id = 1
name = test
area[0][id] = 1
area[0][name] = "A"
area[1][id] = 2
area[1][name] = "B"
MVC期望:

id = 1
name = test
area[0].id = 1
area[0].name = "A"
area[1].id = 2
area[1].name = "B"

如何按预期发布此消息?

您的模型包含数组,因此您必须对模型进行字符串化,并将结果字符串发送给控制器。您可以尝试以下方法:

var EntryModel = function () {
    var self = this;

    self.entry = new Entry();

    //toJSON function produce the JSON string representing entry model
    var dataToSend = ko.toJSON(self.entry);

    self.save = function () {
        $.post("/Edit", dataToSend, function (data) {
            ...
        })};
    };
};

如何将数据发送到服务器?jqueryajax?XmlHttpRequest?你能展示一下代码吗?我想你可能发布的数组不正确,我看到你在使用jquery发布。请看这篇文章的答案:。尝试使用设置了dataType和contentType的jquery$.ajax函数发布数据。还可以尝试将选项“传统”设置为“真”。@PatrickSteele,过账代码位于EntryModel的“保存”功能中。@MyP3uK,谢谢。你指给我的问题修正了这个帖子。我仍在试图理解为什么我的数据会以这种方式序列化(可能是ko.ToJS?),以及是否有办法使其正常工作。请尝试在$.post之前添加一个“alert(ko.toJSON(self.entry))”。这将让您验证是否确实有正确的数据要发送。您是否使用Chrome Developer Tools或Fiddler之类的工具查看了通过网络传输的数据?这将向我的控制器发送一个字符串。它可以被处理和反序列化,但这不是我的问题。@Haas它不是一个
字符串
,而是一个代表您的viewModel的JSON字符串。您不必反序列化它,MVC的默认模型绑定器将为您完成这项工作。我尝试了它,得到的只是控制器上的一个空视图模型。您可以发布服务器端视图模型代码结构吗?