Объект javascript Date из IE не может автоматически привязываться к Datetime в ASP.NET MVC
У меня есть сайт, который использует календарь jquery для отображения событий.
Я заметил, что при использовании системы из IE (все версии) ASP.NET MVC не сможет привязать дату и время к действию, которое отправляет правильные события.
Последовательность событий происходит следующим образом.
- Сообщения календаря на сервере для получения событий
- Сервер ActionMethod принимает дату начала и окончания, автоматически привязан к объектам datetime.
В каждом браузере, отличном от IE, дата начала и окончания проходит через:
Mon, 10 Jan 2011 00:00:00 GMT
Когда IE помещает дату, она проходит через
Mon, 10 Jan 2011 00:00:00 UTC
ASP.NET MVC 2 не сможет автоматически привязать это к параметру метода действия.
Есть ли причина, почему это происходит?
Код, который отправляется на сервер, выглядит следующим образом:
data: function (start, end, callback) {
$.post('/tracker/GetTrackerEvents', { start: start.toUTCString(), end: end.toUTCString() }, function (result) { callback(result); });
},
Ответы
Ответ 1
Я столкнулся с той же проблемой, и решил ее с помощью функции JavaScript Date().toISOString() (вместо замены строки).
См. здесь doc.
DateTime
и DateTimeOffset
будут обрабатывать это правильно независимо от отправки браузером (в моем ограниченном тестировании IE, Firefox и Chrome).
Итак, я отправляю дату на контроллер как это (это мой объект JS):
var dateObject = new Date();
dateObject.toISOString()
И сервер может анализировать данные так (.NET - в контроллере):
DateTimeOffset timeInGMT = DateTime.Parse(dateString).ToUniversalTime(); //for the time in GMT
DateTime timeOnClient = DateTime.Parse(dateString); //for time as it was set on the client.
Ответ 2
попробуйте заменить
start.toUTCString()
с
start.toUTCString().replace('UTC','GMT')
и посмотрите, не устранит ли это проблему для вас:)
Ответ 3
Когда я использую функцию .toUTCString()
в IE, у меня были проблемы с UTC
vs GMT
, а также с ведущими нулями.
Это то, что я использую для отправки даты UTC в ASP.NET MVC:
function getUTCString (date) {
function pad(n) { return n < 10 ? "0" + n : n }
var weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
return weekday[date.getUTCDay()]
+ ", " + pad(date.getUTCDate())
+ " " + month[date.getUTCMonth()]
+ " " + date.getUTCFullYear()
+ " " + pad(date.getUTCHours())
+ ":" + pad(date.getUTCMinutes())
+ ":" + pad(date.getUTCSeconds())
+ " GMT";
};
Ответ 4
Я также столкнулся с этой странной ситуацией.
Замена UTC на GMT в строке даты решила мою проблему, но я хотел искать другой способ (замена строк иногда вызывает проблемы:)).
Я придумал следующее решение, которое хорошо работало в IE, Chrome и Firefox:
var myUTCDateString = (function(d) {
return d.getUTCFullYear() + "-" + (d.getUTCMonth() +1) + "-" + d.getUTCDate() + " " + d.getUTCHours() + ":" + d.getUTCMinutes() + ":" + d.getUTCSeconds();
})(new Date());
myUTCDateString - это что-то вроде "2012-1-3 21:47:49".
Ответ 5
Я нашел здесь и модифицировал помощника:
// #region Date.prototype.toISONonUtcString
// add Date prototype toISONonUtcString function if it doesn't yet exist
if ($.isFunction(Date.prototype.toISONonUtcString) === false) {
Date.prototype.toISONonUtcString = function () {
var pad = function (n, places) {
n = n.toString();
for (var i = n.length; i < places; i++) {
n = "0" + n;
}
return n;
};
var d = this;
return pad(d.getFullYear(), 4) + '-' + pad(d.getMonth() + 1, 2) + '-' + pad(d.getDate(), 2) + 'T' +
pad(d.getHours(), 2) + ':' + pad(d.getMinutes(), 2) + ':' + pad(d.getSeconds(), 2) + '.' +
pad(d.getMilliseconds(), 3);
};
}
// #endregion