J'ai une action de contrôleur qui renvoie simplement un JsonResult de mon modèle. Donc, dans ma méthode, j'ai quelque chose comme ceci:
return new JsonResult(myModel);
Cela fonctionne bien, sauf pour un problème. Il y a une propriété date dans le modèle et cela semble être retourné dans le résultat Json comme ceci:
"\/Date(1239018869048)\/"
Comment dois-je traiter les dates pour qu'elles soient retournées dans le format dont j'ai besoin? Ou comment gérer ce format ci-dessus dans le script?
javascript
asp.net-mvc
json
Jon Archway
la source
la source
Réponses:
Juste pour développer la réponse de casperOne .
La spécification JSON ne prend pas en compte les valeurs de date. MS a dû faire un appel, et le chemin qu'ils ont choisi était d'exploiter une petite astuce dans la représentation javascript des chaînes: le littéral de chaîne "/" est le même que "\ /", et un littéral de chaîne ne sera jamais sérialisé en " \ / "(même" \ / "doit être mappé sur" \\ / ").
Voir http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 pour une meilleure explication (faites défiler jusqu'à "Des littéraux JavaScript vers JSON")
Une solution serait de simplement analyser:
Cependant, j'ai entendu dire qu'il y avait un paramètre quelque part pour que le sérialiseur génère des
DateTime
objets avec lanew Date(xxx)
syntaxe. Je vais essayer de creuser ça.Le deuxième paramètre de
JSON.parse()
accepte unereviver
fonction où prescrit comment la valeur produite à l'origine par, avant d'être renvoyée.Voici un exemple de date:
Voir les documents de JSON.parse ()
la source
parseInt()
. Il indique à la fonction d'extraire un entier dans le système numérique de base 10. C'est un radix. Si vous y mettez8
, cela extraira un nombre octal.Voici ma solution en Javascript - un peu comme JPot, mais plus courte (et peut-être un tout petit peu plus rapide):
"value.substr (6)" supprime la partie "/ Date (", et la fonction parseInt ignore les caractères non numériques qui se produisent à la fin.
EDIT: J'ai intentionnellement laissé de côté le radix (le deuxième argument à analyser); voir mon commentaire ci-dessous . Veuillez également noter que les dates ISO-8601 sont préférées à cet ancien format - donc ce format ne devrait généralement pas être utilisé pour de nouveaux développements. Voir l'excellente bibliothèque Json.NET pour une excellente alternative qui sérialise les dates en utilisant le format ISO-8601.
Pour les dates JSON au format ISO-8601, passez simplement la chaîne dans le constructeur Date:
la source
value.substr(6, 13)
pour supprimer les autres caractères non numériques. Mais si vous faites cela, toutes les dates AVANT le 26/04/1938 sont invalides! Nous ne savions pasparseInt
qu'il ignorerait les caractères non numériques. Merci!parseInt
devrait ignorer les zéros de tête à partir d' ECMAScript ed 5 (2011).Il y a pas mal de réponses pour le gérer côté client, mais vous pouvez changer le côté serveur de sortie si vous le souhaitez.
Il y a plusieurs façons d'aborder cela, je vais commencer par les bases. Vous devrez sous-classer la classe JsonResult et remplacer la méthode ExecuteResult. À partir de là, vous pouvez adopter différentes approches pour modifier la sérialisation.
Approche 1: l' implémentation par défaut utilise JsonScriptSerializer . Si vous jetez un œil à la documentation, vous pouvez utiliser la méthode RegisterConverters pour ajouter des JavaScriptConverters personnalisés . Il y a cependant quelques problèmes: Le JavaScriptConverter sérialise dans un dictionnaire, c'est-à-dire qu'il prend un objet et sérialise dans un dictionnaire Json. Pour que l'objet soit sérialisé en chaîne, il faut un peu de piratage, voir l' article . Ce hack particulier échappera également à la chaîne.
Approche 2 (recommandée): La deuxième approche consiste à commencer par le JsonResult remplacé et à aller avec un autre sérialiseur Json, dans mon cas le sérialiseur Json.NET . Cela ne nécessite pas le piratage de l'approche 1. Voici mon implémentation de la sous-classe JsonResult:
Exemple d'utilisation:
Crédits supplémentaires: James Newton-King
la source
Moment.js est une bibliothèque de datetime étendue qui prend également en charge cela. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
ex: moment ("/ Date (1198908717056-0700) /")
Ça pourrait aider. sortie plongeur
la source
moment("json_date_string_value").format('appropriate format');
vous pouvez voir différentes valeurs de format sur la pageJ'ai trouvé que créer un nouveau
JsonResult
et revenir qui n'est pas satisfaisant - devoir remplacer tous les appels àreturn Json(obj)
avecreturn new MyJsonResult { Data = obj }
est une douleur.J'ai donc pensé, pourquoi ne pas simplement détourner l'
JsonResult
utilisation d'unActionFilter
:Cela peut être appliqué à toute méthode renvoyant un
JsonResult
pour utiliser JSON.Net à la place:qui répondra avec
comme voulu!
Vous pouvez, si cela ne vous dérange pas appeler la
is
comparaison à chaque demande, l'ajouter à votreFilterConfig
:et tout votre JSON sera désormais sérialisé avec JSON.Net au lieu du intégré
JavaScriptSerializer
.la source
Utiliser jQuery pour convertir automatiquement des dates avec
$.parseJSON
Puisque vous utilisez Asp.net MVC, je soupçonne que vous utilisez jQuery du côté client. Je vous suggère de lire cet article de blog contenant du code sur la façon d'utiliser
$.parseJSON
pour convertir automatiquement les dates pour vous.Le code prend en charge les dates au format Asp.net comme celles que vous avez mentionnées ainsi que les dates au format ISO. Toutes les dates seront automatiquement formatées pour vous en utilisant
$.parseJSON()
.la source
La communication Ajax entre le client et le serveur implique souvent des données au format JSON. Bien que JSON fonctionne bien pour les chaînes, les nombres et les booléens, il peut poser quelques difficultés pour les dates en raison de la façon dont ASP.NET les sérialise. Comme il n'a pas de représentation spéciale pour les dates, elles sont sérialisées en chaînes simples. Comme solution, le mécanisme de sérialisation par défaut des formulaires Web ASP.NET et MVC sérialise les dates sous une forme spéciale - / Date (ticks) / - où ticks est le nombre de millisecondes depuis le 1er janvier 1970.
Ce problème peut être résolu de 2 manières:
côté client
Convertissez la chaîne de date reçue en nombre et créez un objet date en utilisant le constructeur de la classe de date avec les ticks comme paramètre.
du côté serveur
La solution précédente utilise un script côté client pour convertir la date en un objet Date JavaScript. Vous pouvez également utiliser du code côté serveur qui sérialise les instances .NET DateTime au format de votre choix. Pour accomplir cette tâche, vous devez créer votre propre ActionResult, puis sérialiser les données comme vous le souhaitez.
référence: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
la source
J'ai eu le même problème et au lieu de renvoyer la valeur de date réelle, je viens d'utiliser ToString ("jj MMM aaaa") dessus. Puis, dans mon javascript, j'ai utilisé une nouvelle date (datevalue), où datevalue peut être "01 jan 2009".
la source
ToString("o")
?Voir ce fil:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
Fondamentalement, bien que le
Date()
format soit du javascript valide, ce n'est PAS du JSON valide (il y a une différence). Si vous voulez l'ancien format, vous devrez probablement créer une façade et transformer la valeur vous-même, ou trouver un moyen d'obtenir le sérialiseur pour votre type dans leJsonResult
et de lui faire utiliser un format personnalisé pour les dates.la source
Pas la manière la plus élégante mais cela a fonctionné pour moi:
la source
J'ai travaillé sur une solution à ce problème car aucune des réponses ci-dessus ne m'a vraiment aidé. Je travaille avec le calendrier de la semaine jquery et j'avais besoin de mes dates pour avoir des informations de fuseau horaire sur le serveur et localement sur la page. Après avoir longuement fouillé, j'ai trouvé une solution qui pourrait aider les autres.
J'utilise asp.net 3.5, vs 2008, asp.net MVC 2 et le calendrier de la semaine jquery,
Tout d'abord, j'utilise une bibliothèque écrite par Steven Levithan qui aide à gérer les dates côté client, la bibliothèque de dates de Steven Levithan . Le format isoUtcDateTime est parfait pour ce dont j'avais besoin. Dans mon appel AJAX jquery, j'utilise la fonction de format fournie avec la bibliothèque au format isoUtcDateTime et lorsque l'appel ajax atteint ma méthode d'action, le type datetime est défini sur local et reflète l'heure du serveur.
Lorsque j'envoie des dates sur ma page via AJAX, je les envoie sous forme de chaînes de texte en formatant les dates en utilisant "jjj, jj MMM aaaa HH ':' mm ':' ss 'GMT'zzzz". Ce format est facilement convertible côté client en utilisant
Voici ma solution complète moins la source de Steve Levithan, que vous pouvez télécharger:
Manette:
Javascript:
J'espère que cet exemple rapide aide les autres dans la même situation que celle dans laquelle je me trouvais. À l'heure actuelle, il semble très bien fonctionner avec la sérialisation Microsoft JSON et conserve mes dates correctes sur tous les fuseaux horaires.
la source
La meilleure façon de gérer les dates dans knockoutjs est d'utiliser la bibliothèque de moments et de gérer les dates comme boss. Vous pouvez facilement gérer des dates telles que / Date (-62135578800000) /. Pas besoin de se soucier de la façon dont votre date de sérialisation dans le contrôleur.
l'utiliser comme
momentjs prend en charge de nombreux formats de date et d'heure et des fonctions utilitaires sur les dates.
la source
Formatez la date dans la requête.
Le seul problème avec cette solution est que vous n'obtiendrez aucun résultat si TOUTES les valeurs de date sont nulles. Pour contourner ce problème, vous pouvez soit placer des instructions conditionnelles dans votre requête AVANT de sélectionner la date qui ignore les nulls de date, soit configurer une requête pour obtenir tous les résultats, puis parcourir toutes ces informations à l'aide d'une boucle foreach et attribuer une valeur à toutes les dates qui sont nulles AVANT de faire votre SELECT nouveau.
Exemple des deux:
La deuxième option nécessite une autre requête entièrement afin que vous puissiez attribuer des valeurs à tous les null. Cela et la boucle foreach devraient être AVANT votre requête qui sélectionne les valeurs.
Juste une idée que j'ai trouvée plus facile que tous les exemples javascript.
la source
Vous pouvez utiliser cette méthode:
la source
0
Dans votre cshtml,
Dans votre fichier JS, peut-être app.js,
En dehors de app.controller, ajoutez le filtre ci-dessous.
Ici, "mydate" est la fonction que vous appelez pour analyser la date. Ici, "l'application" est la variable qui contient le module angulaire.
la source
ajoutez le plugin jquery ui dans votre page.
la source
Pas pour rien, mais il existe un autre moyen. Commencez par construire votre requête LINQ. Ensuite, créez une requête du résultat énuméré et appliquez le type de mise en forme qui vous convient.
Je dois dire que l'étape supplémentaire est ennuyeuse, mais cela fonctionne bien.
la source
Ce qui a fonctionné pour moi a été de créer un modèle de vue contenant la propriété date sous forme de chaîne. Affecter la propriété DateTime à partir du modèle de domaine et appeler le .ToString () sur la propriété date lors de l'attribution de la valeur au viewmodel.
Un résultat JSON d'une méthode d'action MVC renverra la date dans un format compatible avec la vue.
Voir le modèle
Modèle de domaine
Méthode d'action du contrôleur
la source
Remplacez les contrôleurs Json / JsonResult pour renvoyer JSON.Net:
Cela fonctionne un régal
la source
Ennuyeux, non?
Ma solution a été de changer mon service WCF pour qu'il retourne DateTimes dans un format plus lisible (non Microsoft). Remarquez ci-dessous, le "
UpdateDateOriginal
", qui est le format par défaut des dates de WCF, et mon "UpdateDate
", qui est formaté pour quelque chose de plus lisible.Voici comment procéder:
Modification du format de date WCF
J'espère que cela t'aides.
la source
J'ai trouvé que c'était le moyen le plus simple de le changer côté serveur.
la source
J'ai eu un certain nombre de problèmes avec les dates JSON et j'ai décidé de me débarrasser du problème en résolvant le problème de date dans SQL. Changer le format de date en un format de chaîne
En utilisant fldDateStr, le problème a disparu et je pouvais toujours utiliser le champ de date pour le tri ou à d'autres fins.
la source
Il renvoie le format de date du serveur. Vous devez définir votre propre fonction.
la source
Voici un code JavaScript que j'ai écrit qui définit une
<input type="date">
valeur à partir d'une date transmise par ASP.NET MVC.Vous appelez cette fonction comme ceci:
Où
commissionStartDate
est la date JSON passée par MVC.la source
Le plus simple:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = nouvelle date (milisegundos). toLocaleDateString ("en-UE");
la source