ko.toJSON()是否适用于日期?

时间:2011-05-09 21:38:52

标签: ajax json knockout.js

我在asp.net mvc页面上使用knockoutjs。我使用ajax通过调用ko.toJSON(viewModel)将表单保存回服务器,然后使用jQuery将结果发回服务器。除了作为空对象持久化的Javascript日期之外,视图模型上的所有属性都已成功序列化。

声明:

var viewModel = {
    startTime: ko.observable(),
    type: ko.observable(),
    durationInMinutes: ko.observable(),
    notes: ko.observable()
};

保存数据:

var postData = ko.toJSON(viewModel); 
$.ajax({
    url: "/data",
    type: "POST",
    data: postData,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function () {
        console.log('success!');
    },
    error: function () {
        console.log('fail!');
    }
});

viewModel.startTime()的console.log值为:

  

Date {Tue May 10 2011 11:30:00 GMT-0500 (Central Daylight Time)}

保存数据的第1行之后,postData的值为:

{
    "startTime": {},
    "type": "1",
    "durationInMinutes": "45",
    "notes": "asfasdfasdfasdfasdfasdfasdfas",
    "displayableStartTime": "10-May 11:30"
}

如果我将保存数据的第1行扩展为

var jsonEvent = ko.toJS(viewModel);
jsonEvent.startTime = viewModel.startTime();
var postData = JSON.stringify(jsonEvent);

postData的值是:

{
    "startTime": "2011-05-10T16:30:00.000Z",
    "type": "1",
    "durationInMinutes": "45",
    "notes": "asfasdfasdfasdfasdfasdfasdfas",
    "displayableStartTime": "10-May 11:30"
}

任何人都可以解释可能发生的事情以及我如何能够获得knockoutjs来处理日期对象吗?

2 个答案:

答案 0 :(得分:3)

鉴于ko.toJS和日期的当前问题,一个选项是创建一个dependentObservable,其中包含您希望服务器处理的实际值。

类似的东西:

var viewModel = {
    startTimeForInput: ko.observable(),
    type: ko.observable(),
    durationInMinutes: ko.observable(),
    notes: ko.observable()
};

viewModel.startTime = ko.dependentObservable(function() {
    return this.startTimeForInput().toJSON();
}, viewModel);

ko.applyBindings(viewModel);

现在,当您致电ko.toJSON时,您将获得具有服务器可以使用的正确值的startTime

对于旧版浏览器,像json2.js这样的东西会包含Date对象的.toJSON。

答案 1 :(得分:1)

ko.toJSON()我遇到问题,当日期为DateTime.MinValue时,我的日期格式不正确。

虽然可能无法解决您的问题,但此修复程序适用于我的ko.toJSON()日期问题:

var postData = JSON.parse(JSON.stringify(ko.toJSON(viewModel)).replace(/\"1-01-01/g, "\"0001-01-01"));

ASP.Net WebMethod fails because ko.toJSON() produces different results for DateTime.MinValue