У меня есть действие контроллера, которое фактически просто возвращает JsonResult моей модели. Итак, в моем методе у меня есть что-то вроде следующего:
return new JsonResult(myModel);
Это работает хорошо, за исключением одной проблемы. В модели есть свойство date, и это, похоже, возвращается в результате Json следующим образом:
"\/Date(1239018869048)\/"
Как мне обращаться с датами, чтобы они возвращались в том формате, который мне нужен? Или как мне обработать этот формат выше в сценарии?
javascript
asp.net-mvc
json
Джон Арчвей
источник
источник
Ответы:
Просто чтобы расширить ответ КасперОна .
Спецификация JSON не учитывает значения даты. MS пришлось сделать вызов, и путь, который они выбрали, заключался в том, чтобы использовать небольшую хитрость в представлении строк в javascript: строковый литерал "/" такой же, как "\ /", и строковый литерал никогда не будет сериализован в " \ / "(даже" \ / "должно быть сопоставлено с" \\ / ").
См. Http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 для лучшего объяснения (прокрутите вниз до «От литералов JavaScript до JSON»)
Решением было бы просто разобрать это:
Однако я слышал, что где-то есть настройка, позволяющая сериализатору выводить
DateTime
объекты сnew Date(xxx)
синтаксисом. Я постараюсь выкопать это.Второй параметр
JSON.parse()
принимаетreviver
функцию, которая предписывает, как значение, изначально произведенное, до его возвращения.Вот пример для даты:
Смотрите документы JSON.parse ()
источник
parseInt()
. Он говорит функции, чтобы извлечь целое число в базовой системе счисления 10. Это основа. Если вы вставите8
туда, он извлечет восьмеричное число.Вот мое решение в Javascript - очень похожее на JPot, но более короткое (и, возможно, чуть-чуть быстрее):
«value.substr (6)» убирает часть «/ Date (»), а функция parseInt игнорирует нечисловые символы, встречающиеся в конце.
РЕДАКТИРОВАТЬ: я намеренно пропустил основание (2-й аргумент для parseInt); см. мой комментарий ниже . Кроме того, обратите внимание, что даты ISO-8601 предпочтительнее этого старого формата, поэтому этот формат обычно не следует использовать для новой разработки. Посмотрите превосходную библиотеку Json.NET для отличной альтернативы, которая сериализует даты, используя формат ISO-8601.
Для дат JSON в формате ISO-8601 просто передайте строку в конструктор Date:
источник
value.substr(6, 13)
для удаления других не числовых символов. Но если вы сделаете это, все даты ДО 26.04.1938 будут недействительными! Мы не знали,parseInt
будут игнорировать не числовые символы. Спасибо!parseInt
следует игнорировать начальные нули, как в ECMAScript ed 5 (2011).Есть довольно много ответов, чтобы справиться с этим на стороне клиента, но вы можете изменить сторону сервера вывода, если хотите.
Есть несколько способов подойти к этому, я начну с основ. Вам придется создать подкласс класса JsonResult и переопределить метод ExecuteResult. Оттуда вы можете использовать несколько различных подходов для изменения сериализации.
Подход 1. Реализация по умолчанию использует JsonScriptSerializer . Если вы посмотрите на документацию, вы можете использовать метод RegisterConverters для добавления пользовательских JavaScriptConverters . Однако с этим есть несколько проблем: JavaScriptConverter сериализуется в словарь, то есть он берет объект и сериализуется в словарь Json. Чтобы сериализовать объект в строку, требуется немного хакерства, см. Пост . Этот конкретный хак также ускользнет от строки.
Подход 2 (рекомендуется): Второй подход - начать с переопределенного JsonResult и перейти к другому сериализатору Json, в моем случае - сериализатору Json.NET . Это не требует взлома подхода 1. Вот моя реализация подкласса JsonResult:
Пример использования:
Дополнительные кредиты: Джеймс Ньютон-Кинг
источник
Moment.js - обширная библиотека datetime, которая также поддерживает это. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
пример: момент ("/ Дата (1198908717056-0700) /")
Это может помочь. выход плунжера
источник
moment("json_date_string_value").format('appropriate format');
вы можете увидеть различные значения формата на страницеЯ обнаружил , что создание нового
JsonResult
и возвращение неудовлетворительно - необходимость заменить все вызовыreturn Json(obj)
сreturn new MyJsonResult { Data = obj }
болью.Итак, я решил, почему бы просто не взломать
JsonResult
используяActionFilter
:Это может быть применено к любому методу, возвращающему
JsonResult
использование JSON.Net вместо этого:который ответит
по желанию!
Если вы не против вызывать
is
сравнение при каждом запросе, вы можете добавить это к своемуFilterConfig
:и все ваши JSON теперь будут сериализованы с JSON.Net вместо встроенного
JavaScriptSerializer
.источник
Использование jQuery для автоматического преобразования дат с
$.parseJSON
Поскольку вы используете Asp.net MVC, я подозреваю, что вы используете jQuery на стороне клиента. Я предлагаю вам прочитать этот пост в блоге, в котором есть код, как использовать
$.parseJSON
для автоматического преобразования дат для вас.Код поддерживает даты в формате Asp.net, такие как те, которые вы упомянули, а также даты в формате ISO. Все даты будут автоматически отформатированы для вас с помощью
$.parseJSON()
.источник
Ajax-связь между клиентом и сервером часто включает данные в формате JSON. Хотя JSON хорошо работает со строками, числами и логическими значениями, он может создавать некоторые трудности для дат из-за того, как ASP.NET их сериализует. Поскольку он не имеет специального представления для дат, они сериализуются в виде простых строк. В качестве решения механизм сериализации по умолчанию ASP.NET Web Forms и MVC сериализует даты в специальной форме - / Date (ticks) / - где ticks - это количество миллисекунд с 1 января 1970 года.
Эта проблема может быть решена двумя способами:
сторона клиента
Преобразуйте полученную строку даты в число и создайте объект даты, используя конструктор класса даты с галочками в качестве параметра.
серверная сторона
Предыдущее решение использует клиентский скрипт для преобразования даты в объект JavaScript Date. Вы также можете использовать код на стороне сервера, который сериализует экземпляры .NET DateTime в выбранном вами формате. Для выполнения этой задачи вам нужно создать собственный ActionResult, а затем сериализовать данные так, как вы хотите.
ссылка: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
источник
У меня была та же проблема, и вместо того, чтобы возвращать фактическое значение даты, я просто использовал ToString ("dd MMM yyyy") для него. Затем в моем javascript я использовал новую дату (datevalue), где datevalue может быть «01 января 2009».
источник
ToString("o")
?Смотрите эту тему:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
В основном, хотя
Date()
формат является допустимым javascript, он НЕ является действительным JSON (есть разница). Если вы хотите использовать старый формат, вам, вероятно, придется создать фасад и трансформировать значение самостоятельно, либо найти способ получить доступ к сериализатору для вашего типа вJsonResult
и использовать его в настраиваемом формате для дат.источник
Не самый элегантный способ, но это сработало для меня:
источник
Я работал над решением этой проблемы, так как ни один из приведенных выше ответов действительно не помог мне. Я работаю с календарем недели jquery, и мне нужно, чтобы мои даты содержали информацию о часовом поясе на сервере и локально на странице. Немного покопавшись, я нашел решение, которое может помочь другим.
Я использую asp.net 3.5, 2008, asp.net MVC 2 и календарь недели jquery,
Во-первых, я использую библиотеку, написанную Стивеном Левитаном, которая помогает работать с датами на стороне клиента, библиотеку дат Стивена Левитана . Формат isoUtcDateTime идеально подходит для того, что мне нужно. В моем вызове jquery AJAX я использую функцию форматирования, предоставляемую библиотекой с форматом isoUtcDateTime, и когда вызов ajax затрагивает мой метод действия, тип datetime устанавливается на local и отражает время сервера.
Когда я отправляю даты на свою страницу через AJAX, я отправляю их в виде текстовых строк, форматируя даты с использованием «ddd, dd MMM гггг ЧЧ ':' мм ':' ss 'GMT'zzzz". Этот формат легко конвертируется на стороне клиента
Вот мое полное решение без источника Стива Левитана, которое вы можете скачать:
контроллер:
Javascript:
Я надеюсь, что этот быстрый пример поможет другим в той же ситуации, в которой я находился. В настоящее время он, кажется, очень хорошо работает с сериализацией Microsoft JSON и сохраняет мои даты правильными во всех часовых поясах.
источник
Лучший способ обрабатывать даты в knockoutjs - использовать библиотеку моментов и обрабатывать даты, как boss. Вы можете легко иметь дело с датами, такими как / Дата (-62135578800000) /. Не нужно беспокоиться о том, как ваша дата сериализации в контроллере.
используйте это как
momentjs поддерживает множество форматов даты и времени и функции полезности для дат.
источник
Отформатируйте дату в запросе.
Единственная проблема с этим решением состоит в том, что вы не получите никаких результатов, если ЛЮБОЙ из значений даты равен нулю. Чтобы обойти это, вы можете поместить условные операторы в ваш запрос ДО того, как вы выберете дату, которая игнорирует нулевые значения даты, или вы можете настроить запрос для получения всех результатов, а затем перебрать всю эту информацию с помощью цикла foreach и присвоить значение на все даты, которые являются нулевыми, прежде чем вы сделаете ваш SELECT новым.
Пример обоих:
Второй вариант требует другого запроса полностью, поэтому вы можете присваивать значения всем нулям. Это и цикл foreach должны быть ДО вашего запроса, который выбирает значения.
Просто идея, которую я нашел проще, чем все примеры javascript.
источник
Вы можете использовать этот метод:
источник
0
В вашем cshtml,
В вашем файле JS, возможно, app.js,
За пределами app.controller добавьте фильтр ниже.
Здесь «mydate» - это функция, которую вы вызываете для анализа даты. Здесь «app» - это переменная, которая содержит angular.module
источник
добавьте плагин jquery ui на свою страницу.
источник
Не зря, но есть и другой путь. Сначала создайте запрос LINQ. Затем создайте запрос результата Enumerated и примените любой тип форматирования, который вам подходит.
Я должен сказать, что дополнительный шаг раздражает, но он работает хорошо.
источник
Для меня работало создание модели представления, которая содержала свойство даты в виде строки. Назначение свойства DateTime из модели домена и вызов .ToString () для свойства date при назначении значения для модели представления.
Результат JSON из метода действия MVC вернет дату в формате, совместимом с представлением.
Посмотреть модель
Модель предметной области
Метод действия контроллера
источник
Переопределите контроллеры Json / JsonResult для возврата JSON.Net:
Это работает удовольствие
источник
Раздражает, не так ли?
Мое решение состояло в том, чтобы изменить мою службу WCF, чтобы она возвращала DateTimes в более читаемом (не Microsoft) формате. Обратите внимание, ниже "
UpdateDateOriginal
", который является форматом дат WCF по умолчанию, и мой "UpdateDate
", который отформатирован для чего-то более удобочитаемого.Вот как это сделать:
Изменение формата даты WCF
Надеюсь это поможет.
источник
Я обнаружил, что это самый простой способ изменить это на стороне сервера.
источник
У меня было несколько проблем, связанных с датами JSON, и я решил просто избавиться от проблемы, решив проблему с датами в SQL. Измените формат даты на формат строки
С помощью fldDateStr проблема исчезла, и я все еще мог использовать поле даты для сортировки или других целей.
источник
Возвращает формат даты сервера. Вам нужно определить свою собственную функцию.
источник
Вот некоторый код JavaScript, который я написал, который устанавливает
<input type="date">
значение из даты, переданной из ASP.NET MVC.Вы вызываете эту функцию так:
Где
commissionStartDate
дата JSON, переданная MVC.источник
Самый простой:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = new Date (milisegundos). toLocaleDateString ("en-UE");
источник