Работает ли ko.toJSON() с датами?
Я использую knockoutjs на странице asp.net mvc. Я использую 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!');
}
});
Значение console.log для viewModel.startTime():
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 обрабатывать объект даты?
Ответы
Ответ 1
Учитывая текущую проблему с ko.toJS и датами, одним из вариантов было бы создание зависимого объекта, содержащего реальное значение, с которым сервер должен иметь дело.
Что-то вроде:
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 будет включать объекты .toJSON для даты.
Ответ 2
У меня возникла проблема с 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 не работает, потому что ko.toJSON() создает разные результаты для DateTime.MinValue