【问题标题】:Asp.net MVC 5 Modelbinding multiple JSON objects (knockoutjs)Asp.net MVC 5 Modelbinding 多个 JSON 对象(knockoutjs)
【发布时间】:2014-11-17 23:40:46
【问题描述】:

好的。我遇到了一个我无法理解的问题。

首先,我尝试将几个 ko.observableArrays 作为 JSON 发布到控制器并分别对它们进行模型绑定。当我只发布一个并且不在 .ajax 的数据属性中命名它时,它发布得很好并且模型绑定完美无缺。

这是我的 viewModel 中的一个 sn-p,也是我尝试发布两个 JSON 对象的方式。

        self.timeRanges = ko.observableArray();
        self.geoRequirements = ko.observableArray();

        self.saveWorkWish = function() {


                $.ajax({
                    url: "@Url.Action("SaveWorkWish")",
                type: "POST",
                contentType: 'application/json; charset=utf-8',
                data: {
                    timeRanges: ko.toJSON(self.timeRanges()),
                    geoRequirements: ko.toJSON(self.geoRequirements())
                },

                complete: function (data) {
                    console.log(data);
                }
            });

        };

我的行动

   public JsonResult SaveWorkWish(IList<JSONTimeRanges> timeRanges, IList<JSONGeoRequirements> geoRequirements)
    {

        // do stuff

    }

我得到了这个例外: 无效的 JSON 原语:timeRanges。

有趣的是,当我这样做时:

                $.ajax({
                    url: "@Url.Action("SaveWorkWish")",
                type: "POST",
                contentType: 'application/json; charset=utf-8',
                data: ko.toJSON(self.timeRanges()),

                complete: function (data) {
                    console.log(data);
                }
            });

   public JsonResult SaveWorkWish(IList<JSONTimeRanges> timeRanges)
    {

        // do stuff

    }

效果很好。

最后我注意到的一件事,很可能是错误的原因是:

当我在示例中发布 2 个 Json 时, 这就是 chrome 告诉我我发布的内容: timeRanges=%5B%7B%22startDate%22%3A%2214-09-2014%22%2C%22endDate%22%3A%2220-09-2014%22%2C.....等..

在工作示例中:

它是一个格式良好且可读的 JSON 对象。

所以看起来错误确实是正确的,并且我没有向控制器发送有效的 JSON。

但是..我做错了什么?

【问题讨论】:

    标签: c# asp.net-mvc json knockout.js model-binding


    【解决方案1】:

    尝试先将 observables 转换为 JSON,然后将整个对象转换为 json 字符串:

    data: JSON.stringify({
        timeRanges: ko.toJS(self.timeRanges()),
        geoRequirements: ko.toJS(self.geoRequirements())
    }),
    

    【讨论】:

      猜你喜欢
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      相关资源
      最近更新 更多