【问题标题】:MVC model binder issues when posting data from knockout从淘汰赛发布数据时的 MVC 模型绑定器问题
【发布时间】:2014-06-06 05:11:57
【问题描述】:

我有一个淘汰模型,我正试图发布到 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"));

并使用viewModel.save 发布它我从模型活页夹中获得了两个区域,但其中没有数据(即 id = 0,name = "")。

经过一些研究,我发现我正在发布这样的数据:

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"

如何按预期发布此内容?

【问题讨论】:

  • 如何将数据发送到服务器? jQuery AJAX? xmlhttp请求?你能显示那个代码吗?
  • 我认为您可能错误地发布了数组,我看到您正在使用 jquery 发布。看看这个帖子的答案:stackoverflow.com/questions/12572856/…。尝试使用设置了 dataType 和 contentType 的 jquery $.ajax 函数发布数据。也尝试将选项传统设置为 true。
  • @PatrickSteele,发布代码在 EntryModel 的保存功能中。
  • @MyP3uK,谢谢。您指出我要修复帖子的问题。我仍在尝试了解为什么我的数据会按原样被序列化(也许是 ko.ToJS?),以及是否有办法让它正常工作。
  • 尝试在 $.post 之前添加一个“alert(ko.toJSON(self.entry))”。这将让您验证您实际上有正确的数据要发送。您是否使用 Chrome 开发者工具或 Fiddler 之类的工具查看了通过网络传输的数据?

标签: asp.net-mvc-4 knockout.js


【解决方案1】:

你的模型包含数组,所以你必须stringify你的模型并将结果字符串发送到控制器。你可以试试这个:

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

【讨论】:

  • 这将向我的控制器发布一个字符串。它可以处理和反序列化,但这不是我的问题。
  • @Haas 它不是string,它是一个代表您的视图模型的 JSON 字符串。而且您不必反序列化它,MVC 的默认模型绑定器将为您完成这项工作。
  • 我试过了,我得到的只是控制器上的一个空视图模型。
  • 你能发布你的服务器端视图模型代码结构吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-30
  • 2013-10-08
  • 2015-11-16
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多