Это вызов operator = (char ch) - мой отладчик вступил в это. И мой MS VS 2005 компилируется следующим образом без ошибок.
std :: string my_string (""); unsigned int my_number = 1234; my_string = my_number; my_string.operator = (my_number);
Раздражает, не так ли?
Мое решение состояло в том, чтобы изменить мою службу WCF, чтобы вернуть DateTimes в более читаемый (не Microsoft) формат. Обратите внимание, что « UpdateDateOriginal
», который является форматом дат по умолчанию для WCF, и моим « UpdateDate
», который отформатирован на что-то более читаемое.
Вот как это сделать:
Надеюсь, это поможет.
Лучший способ обработки дат в knockoutjs - использовать библиотеку моментов и обрабатывать даты, такие как босс. Вы можете легко иметь дело с датами типа / Date (-62135578800000) /. Не нужно беспокоиться о том, как ваша дата сериализации в контроллере.
function jsonToDate (дата, формат) {return moment (date) .format (format); }
использовать его как
var formattedDate = jsonToDate (дата, 'MM / DD / YYYY')
] momentjs поддерживает множество форматов дат и функций полезности в датах.
Moment.js - обширная библиотека datetime, которая также поддерживает это. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
ex: moment ("/ Date (1198908717056-0700) /" )
Это может помочь. вывод plunker
момент («json_date_string_value»). Format («соответствующий формат»);
вы можете видеть разные значения формата на странице momet.js
– Harshil Shah
26 May 2016 в 06:55
См. эту тему:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
В принципе, в то время как формат Date () действителен javascript, он НЕ является допустимым JSON (есть разница). Если вам нужен старый формат, вам, вероятно, придется создать фасад и преобразовать значение самостоятельно или найти способ получить сериализатор для вашего типа в JsonResult и использовать его в качестве настраиваемого формата для дат.
Отформатируйте дату в запросе.
var _myModel = from _m в model.ModelSearch (word) select new {date = ((DateTime) _m.Date) .ToShortDateString ()};
Единственная проблема с этим решением заключается в том, что вы не получите никаких результатов, если ANY из значений даты равно null. Чтобы обойти это, вы можете либо поставить условные операторы в свой запрос, прежде чем вы выбираете дату, которая игнорирует дату null, или вы можете настроить запрос для получения всех результатов, а затем пропустить всю эту информацию с помощью цикла foreach и присвоить значение ко всем датам, которые являются нулевыми до того, как вы сделаете свой новый SELECT.
Пример обоих:
var _test = from _t в adc.ItemSearchTest (слово), где _t.Date! = null select new {date = ((DateTime) _t .Date) .ToShortDateString ()};
Второй вариант требует другого запроса, поэтому вы можете назначать значения для всех нулей. Это и цикл foreach должны быть перед вашим запросом, который выбирает значения.
var _testA = from _t в adc.ItemSearchTest (word) select _i; foreach (var detail in _testA) {if (detail.Date == null) {detail.Date = Convert.ToDateTime ("1/1/0001"); }}
Просто идея, которую я нашел легче, чем все примеры javascript.
Я обнаружил, что создание нового JsonResult
и возвращение неудовлетворительного - замена всех вызовов на возвращает Json (obj)
с возвратом нового MyJsonResult {Data = obj}
- боль.
Итак, я понял, почему бы не просто захватить JsonResult
с помощью ActionFilter
: [ ! d14]
public class JsonNetFilterAttribute: ActionFilterAttribute {public override void OnActionExecuted (ActionExecutedContext filterContext) {if (filterContext.Result - JsonResult == false) {return; } filterContext.Result = новый фильтр JsonNetResult ((JsonResult )Context.Result); } private class JsonNetResult: JsonResult {public JsonNetResult (JsonResult jsonResult) {this.ContentEncoding = jsonResult.ContentEncoding; this.ContentType = jsonResult.ContentType; this.Data = jsonResult.Data; this.JsonRequestBehavior = jsonResult.JsonRequestBehavior; this.MaxJsonLength = jsonResult.MaxJsonLength; this.RecursionLimit = jsonResult.RecursionLimit; } public override void ExecuteResult (Контекст ControllerContext) {if (context == null) {throw new ArgumentNullException ("context"); } var isMethodGet = string.Equals (context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase); if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet & amp; isMethodGet) {throw new InvalidOperationException ("GET не разрешено! Изменить JsonRequestBehavior для AllowGet."); } var response = context.HttpContext.Response; response.ContentType = string.IsNullOrEmpty (this.ContentType)? "application / json": this.ContentType; if (this.ContentEncoding! = null) {response.ContentEncoding = this.ContentEncoding; } if (this.Data! = null) {response.Write (JsonConvert.SerializeObject (this.Data)); }}}}
Это может быть применено к любому методу, возвращающему JsonResult
вместо JSON.Net:
[JsonNetFilter] public ActionResult GetJson () {return Json (new {hello = new Date (2015, 03, 09)}, JsonRequestBehavior.AllowGet)}
, который будет отвечать [ ! d16]
{"hello": "2015-03-09T00: 00: 00 + 00: 00"}
по желанию!
Вы можете, если не возражать, что сравнивает
при каждом запросе, добавьте это в свой FilterConfig
:
// ... filters.Add (новый JsonNetFilterAttribute ());
, и все ваши JSON теперь будут сериализованы с помощью JSON.Net вместо встроенного JavaScript-скрипта
.
Вы можете использовать этот метод:
String.prototype.jsonToDate = function () {try {var date; eval (("date = new" + this) .replace (/ \ // g, '')); Дата возврата; } catch (e) {return new Date (0); }};
Не самый элегантный способ, но это сработало для меня:
var ms = date.substring (6, date.length - 2); var newDate = formatDate (ms); function formatDate (ms) {var date = new Date (parseInt (ms)); var hour = date.getHours (); var mins = date.getMinutes () + ''; var time = "AM"; // находим время, если (час & gt; = 12) {time = "PM"; } // фиксирует формат часов, если (час & gt; 12) {hour - = 12; } else if (hour == 0) {hour = 12; } // фиксирует формат минут if (mins.length == 1) {mins = "0" + mins; } // return formatted date time string return date.getMonth () + 1 + "/" + date.getDate () + "/" + date.getFullYear () + "" + hour + ":" + mins + "" + время; }
Для обработки клиентской части существует довольно много ответов, но вы можете изменить выходную серверную сторону, если хотите.
Есть несколько способов приблизиться к этому, я начну с основы. Вам придется подклассифицировать класс JsonResult и переопределить метод ExecuteResult. Оттуда вы можете использовать несколько разных подходов для изменения сериализации.
Подход 1: Реализация по умолчанию использует JsonScriptSerializer . Если вы посмотрите на документацию, вы можете использовать метод RegisterConverters для добавления пользовательских JavaScriptConverters . Есть несколько проблем с этим: JavaScriptConverter сериализуется в словаре, то есть он берет объект и сериализуется в Json-словаре. Чтобы сделать сериализацию объекта строкой, он требует немного хакерства, см. [D2] post .
public class CustomJsonResult: JsonResult {private const string _dateFormat = "yyyy-MM-dd HH: mm: ss"; public override void ExecuteResult (Контекст ControllerContext) {if (context == null) {throw new ArgumentNullException ("context"); } HttpResponseBase response = context.HttpContext.Response; if (! String.IsNullOrEmpty (ContentType)) {response.ContentType = ContentType; } else {response.ContentType = "application / json"; } if (ContentEncoding! = null) {response.ContentEncoding = ContentEncoding; } if (Data! = null) {JavaScriptSerializer serializer = новый JavaScriptSerializer (); // Используйте свой подклассу JavaScriptConverter здесь. serializer.RegisterConverters (новый JavascriptConverter [] {новый CustomConverter}); Response.Write (serializer.Serialize (данные)); }}}
Подход 2 (рекомендуется): Второй подход - начать с переопределенного JsonResult и перейти с другим сериализатором Json, в моем случае Json.NET сериализатор. Это не требует взлома подхода 1. Вот моя реализация подкласса JsonResult:
public class CustomJsonResult: JsonResult {private const string _dateFormat = "yyyy-MM-dd HH: mm : сс "; public override void ExecuteResult (Контекст ControllerContext) {if (context == null) {throw new ArgumentNullException ("context"); } HttpResponseBase response = context.HttpContext.Response; if (! String.IsNullOrEmpty (ContentType)) {response.ContentType = ContentType; } else {response.ContentType = "application / json"; } if (ContentEncoding! = null) {response.ContentEncoding = ContentEncoding; } if (Data! = null) {// Использование сериализатора Json.NET var isoConvert = new IsoDateTimeConverter (); isoConvert.DateTimeFormat = _dateFormat; response.Write (JsonConvert.SerializeObject (данные, isoConvert)); }}}
Пример использования:
[HttpGet] public ActionResult Index () {return new CustomJsonResult {Data = new {users = db.Users. К списку(); }}; }
Дополнительные кредиты: Джеймс Ньютон-Кинг
Самый простой:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", "")); Var newDate = новая дата (milisegundos) .toLocaleDateString ("en-UE");
Он возвращает формат даты сервера. Вы должны определить свою собственную функцию.
function jsonDateFormat (jsonDate) {// Изменен формат данных; return (новая дата (parseInt (jsonDate.substr (6)))). format ("mm-dd-yyyy / h: MM tt");
};
Связь Ajax между клиентом и сервером часто включает данные в формате JSON. В то время как JSON хорошо работает для строк, чисел и логических значений, он может создавать определенные трудности для дат из-за того, как они преобразуются в ASP.NET. Поскольку у них нет специального представления для дат, они сериализуются как простые строки. В качестве решения механизм сериализации по умолчанию ASP.NET Web Forms и MVC сериализует даты в специальной форме - / Date (ticks) / - где тики - это количество миллисекунд с 1 января 1970 года.
Эта проблема может быть решена двумя способами:
клиентская сторона
Преобразование полученной строки даты в число и создание объекта даты с использованием конструктора класса даты с параметрами тиков как параметр. [ ! d5]
function ToJavaScriptDate (значение) {var pattern = / Date \ (([^)] +) \) /; var results = pattern.exec (значение); var dt = new Date (parseFloat (результаты [1])); return (dt.getMonth () + 1) + "/" + dt.getDate () + "/" + dt.getFullYear ();
}
серверная сторона
В предыдущем решении используется сценарий на стороне клиента для преобразования даты в объект JavaScript Date. Вы также можете использовать код на стороне сервера, который сериализует экземпляры .NET DateTime в выбранном вами формате. Для выполнения этой задачи вам необходимо создать свой собственный ActionResult и затем сериализовать данные так, как вы хотите.
ссылка: http://www.developer.com/net/dealing-with-json -dates-в-asp.net-mvc.html
Что для меня работало, так это создать модель представления, содержащую свойство date в виде строки. Присвоение свойства DateTime из модели домена и вызов .ToString () в свойстве date при назначении значения в viewmodel.
Результат JSON из метода действия MVC вернет дату в формате, совместимом с представлением.
public class TransactionsViewModel {public string DateInitiated {get; задавать; } public string DateCompleted {get; задавать; }}
public class Transaction {public DateTime? DateInitiated {get; set;} public DateTime? DateCompleted {get; set;}}
public JsonResult GetTransactions () {var transaction = _transactionsRepository.All; var model = new List & lt; TransactionsViewModel & gt; (); foreach (транзакция var в транзакциях) {var item = new TransactionsViewModel {............... DateInitiated = transaction.DateInitiated.ToString (), DateCompleted = transaction.DateCompleted.ToString (),} ; model.Add (пункт); } return Json (модель, JsonRequestBehavior.AllowGet); }
$. parseJSON
Примечание : этот ответ предоставляет расширение jQuery, которое добавляет автоматический ISO и .net.
Поскольку вы используете Asp.net MVC, я подозреваю, что вы используете jQuery на стороне клиента. Я предлагаю вам прочитать это сообщение в блоге , в котором есть код, как использовать
$. ParseJSON
для автоматического преобразования дат для вас.Код поддерживает формат Asp.net даты, подобные тем, которые вы упомянули, а также даты в формате ISO. Все даты будут автоматически отформатированы для вас с помощью
$. ParseJSON ()
.
добавить jquery ui плагин на вашей странице.
function JsonDateFormate (dateFormate, jsonDateTime) {return $ .datepicker.formatDate (dateFormate, eval ('new' + jsonDateTime.slice (1, -1))); };
Вот код JavaScript, который я написал, который устанавливает значение & lt; input type = "date" & gt;
из даты, переданной из ASP.NET MVC.
var setDate = function (id, d) {if (d! == undefined & amp; & amp; d! == null) {var date = new Date (parseInt (d.replace ("/ Date (", ""). заменить (") /", ""), 10)); var day = ('0' + date.getDate ()). slice (-2); var month = ('0' + (date.getMonth () + 1)). slice (-2); var parsedDate = date.getFullYear () + "-" + (месяц) + "-" + (день); $ (Идентификатор) .val (parsedDate); }};
Вы вызываете эту функцию следующим образом:
setDate ('# productCommissionStartDate', data.commissionStartDate);
Где CommissionStartDate - дата JSON, переданная MVC.
value.substr (6, 13)
для удаления других несимвольных символов. Но если вы это сделаете, все даты до 26.04.1938 недействительны! Мы не знали, чтоparseInt
игнорирует символы с номерами. Благодаря! – Ralph Jansen 24 June 2014 в 14:20parseInt ()
. Он сообщает функции для извлечения целого числа в системе счисления в базе 10. Это радикс. Если вы поместите8
туда, он будет извлекать восьмеричное число. – AnalogWeapon 4 January 2017 в 21:20parseInt
должен игнорировать ведущие нули на ECMAScript ed 5 (2011). – RobG 28 April 2017 в 22:46