Knockout.js:ko.toJSON不会将viewmodel转换为JSON

时间:2012-05-04 15:02:41

标签: jquery json iis knockout.js

我有一个非常奇怪的问题,我的viewmodels没有在IIS上转换为JSON。如果我在我的系统上调试相同的代码,它工作正常并将viewmodesl转换为JSON。相同的代码在IIS上不会产生相同的结果。

这就是我在调用ko.toJSON之后我的viewmodels的样子。

在IIS上:

"{"__ko_mapping__":{"ignore":[],"include":["_destroy"],"copy":[],"mappedProperties": {"__type":true,"Prop1":true,"Prop2":true,"Prop3":true,"Prop4":true,"Prop5":true}}}"

在本地

{"__type":"DealerModel","Prop1":"","Prop2":"","Prop3":"","Prop4":"","Prop5":"Some Name  ltd"}}}"

这就是我的DealerModel类的样子:

[Serializable]
Public class DealerModel
{
    public string Porp1 { get; set; }
    public string Porp2 { get; set; }
    public string Porp3 { get; set; }
    public string Porp4 { get; set; }
    public string Porp5 { get; set; }
}

我想问题是DealerModel不会以类型的形式传递给JSON或其他东西。

有没有人遇到过这个问题?这可能是什么问题?

这是我将viewmodesl转换为JS的方式。服务器端的方法需要arraylist。

            var jsonViewModel = '';
            jsonViewModel = ko.toJSON(myNameSpace.ViewModel1);
            jsonViewModel = jsonViewModel.replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
            saveArray[0] = jsonViewModel

            jsonViewModel = ko.toJSON(myNameSpace.ViewModel2);
            jsonViewModel = jsonViewModel.replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
            saveArray[1] = jsonViewModel

$.ajax({
                type: "POST",
                url: "Services/SomeService.asmx/SaveObjects",
                cache: true,
                contentType: "application/json; charset=utf-8",
                data:"{args:" + ko.toJSON(saveArray) + "}",
                dataType: "json"
            });

SaveObjects方法需要arrayList。

4 个答案:

答案 0 :(得分:3)

ko.toJSON(saveArray);

它不会创建json对象。它会产生json字符串。

创建json对象使用

ko.toJS(saveArray);

注意:为了在没有本机JSON序列化程序(例如,IE 7或更早版本)的旧浏览器上工作,您还必须引用json2.js库。

答案 1 :(得分:1)

ko.mapping plugin是否添加了__ko_mapping__?看起来该对象没有属性,就好像在IIS上使用ko.mapping并尝试传递空映射选项对象,但交换参数:

var mappingOptions = { };
var data = { "FirstName": "Bruce". "LastName": "Banner" };
var vmBad = ko.mapping.fromJS(mappingOptions, data);
var vmGood = ko.mapping.fromJS(data, mappingOptions);

vmBad实际上是一个视图模型,只有隐藏的 ko_mapping 属性,映射插件使用...如果你有,你需要使用ko.mapping转换回json去除那个财产。 (jsfiddle

答案 2 :(得分:0)

你应该能够做到这一点:

        $.ajax({
            type: "POST",
            url: "Services/SomeService.asmx/SaveObjects",
            data: { args: saveArray }
        });

如果这不起作用,您也可以发布端点代码吗?

<强>更新 我从你的ajax帖子中删除了我认为你不需要的东西,因为我没有看到任何来自服务器的数据的回调。

答案 3 :(得分:-1)

当您致电ko.toJSON(myNameSpace.ViewModel1)时,它应为ko.toJSON(myNameSpace.ViewModel1())。视图模型的执行可能会正确显示您的属性。