Как передать значение даты JSON через ASP.NET MVC с помощью JSON.NET?
Возможный дубликат:
Отформатируйте дату Microsoft JSON?
Функция ASP.NET Json()
форматирует и возвращает дату как
{"d":"\/Date(1240718400000)\/"}
который должен решаться на стороне клиента, что является проблематичным. Каковы ваши предложения относительно подходов к отправке значений даты взад и вперед?
Ответы
Ответ 1
Это было найдено в другом сообщении в Stack Overflow:
var date = new Date(parseInt(jsonDate.substr(6)));
Функция substr вынимает "/Date (" part ", а функция parseInt получает целое число и игнорирует" )/"в конце. Полученное число передается в конструктор Date.
Ответ 2
Если вы не привязаны к сериализатору MS JSON, вы можете использовать Json.NET. Он поставляется с IsoDateTimeConverter для обработки проблем с сериализацией дат. Это приведет к сериализации даты в формате ISO 8601.
Например, в нашем проекте сериализация myObject
обрабатывается с помощью следующего кода.
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.SerializerSettings.Converters.Add(new IsoDateTimeConverter());
jsonNetResult.Data = myObject;
Если вы решите выполнить Json.NET, вы также захотите захватить JsonNetResult, поскольку он возвращает ActionResult, который может использоваться в Приложение ASP.NET MVC. Он довольно прост в использовании.
Для получения дополнительной информации см. Good (Date) Times с Json.NET
Ответ 3
Он может быть уродливым, но он работает:
var epoch = (new RegExp('/Date\\((-?[0-9]+)\\)/')).exec(d);
$("#field").text((new Date(parseInt(epoch[1]))).toDateString());
Возможно, нет необходимости сопоставлять всю строку, а просто (-? [0-9] +) достаточно...
Ответ 4
Не все согласны со мной, что это хорошая идея, но я чаще всего возвращаю форматированные строки вместо правильных дат. См. Как обрабатывать даты JSON, возвращаемые ASP.NET AJAX.
Ответ 5
После игры с библиотекой Json.NET мне интересно, почему вы решили использовать IsoDateTimeConverter над JavascriptDateTimeConverter.
Я нашел, что это проще в использовании с Ext JS интерфейсами, которые я использовал при сериализации дат из MVC-контроллера.
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.SerializerSettings.Converters.Add(new JavaScriptDateTimeConverter());
jsonNetResult.Data = myObject;
Я возвращаю эти данные в файл Ext.data.JsonStore, который может получить возвращаемое значение в качестве даты без необходимости указывать формат даты для синтаксического анализа.
store:new Ext.data.JsonStore({
url: pathContext + '/Subject.mvc/Notices',
baseParams: { subjectId: this.subjectId },
fields: [
{name: 'Title'},
{name: 'DateCreated', type: 'date' }
]
}),
Возврат JSON выглядит следующим образом:
[{"Title":"Some title","DateCreated":new Date(1259175818323)}]
Нет никаких оснований для преобразования в формат ISO 8601 и обратно, если вам это не нужно.
Ответ 6
Автоматическое преобразование дат на стороне клиента (если вы используете jQuery)
-
Вы не указали его, но поскольку вы используете ASP.NET MVC, вы можете использовать jQuery. Если вы это сделаете, преобразование в фактические даты стало проще, если вы использовали код, указанный в этом сообщении в блоге. Код расширяет функциональность jQuery $.parseJSON()
, поэтому он автоматически преобразует строки даты ISO и ASP.NET в фактические даты JavaScript.
Я использую его с ASP.NET MVC, и он работает как шарм. Лучшая часть состоит в том, что он также обратно совместим. Существующий код, который использует $.parseJSON()
, будет работать так же, как и раньше (и фактически работает так же), но если вы предоставите второй параметр и установите его значение на true
, все даты будут автоматически преобразованы для вас.
Расширение использует встроенную поддержку JSON для браузера, где это применимо, а также работает в других, которые этого не делают. Современные браузеры поддерживают эту функциональность в любом случае.
Ответ 7
Взгляните на сообщение в блоге jQuery, Ajax, ASP.NET и даты.
Подробности о работе с ASP.NET MVC и jQuery для передачи дат через JSON между сервером и клиентской стороной.