我在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来处理日期对象吗?
答案 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