ko.toJSON()与日期一起工作吗?

我在一个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来处理日期对象?


考虑到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。


当日期是DateTime.MinValue时,我遇到了ko.toJSON()给我一个错误日期格式的问题。

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

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

ASP.Net WebMethod失败,因为ko.toJSON()为DateTime.MinValue产生不同的结果

链接地址: http://www.djcxy.com/p/52569.html

上一篇: Does ko.toJSON() work with dates?

下一篇: Using <keygen> to get an RSA key for use with javascript?