Ich habe eine Controller-Aktion, die effektiv einfach ein JsonResult meines Modells zurückgibt. In meiner Methode habe ich also ungefähr Folgendes:
return new JsonResult(myModel);
Dies funktioniert gut, bis auf ein Problem. Das Modell enthält eine Datumseigenschaft, die im Json-Ergebnis wie folgt zurückgegeben wird:
"\/Date(1239018869048)\/"
Wie soll ich mit Daten umgehen, damit sie in dem von mir gewünschten Format zurückgegeben werden? Oder wie gehe ich mit diesem Format oben im Skript um?
javascript
asp.net-mvc
json
Jon Archway
quelle
quelle
Antworten:
Nur um die Antwort von casperOne zu erweitern .
Die JSON-Spezifikation berücksichtigt keine Datumswerte. MS musste einen Anruf tätigen, und der von ihnen gewählte Weg bestand darin, einen kleinen Trick in der Javascript-Darstellung von Zeichenfolgen auszunutzen: Das Zeichenfolgenliteral "/" ist dasselbe wie "\ /", und ein Zeichenfolgenliteral wird niemals serialisiert. " \ / "(sogar" \ / "muss" \\ / "zugeordnet sein).
Eine bessere Erklärung finden Sie unter http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 (scrollen Sie nach unten zu "Von JavaScript-Literalen zu JSON").
Eine Lösung wäre, es einfach zu analysieren:
Ich habe jedoch gehört, dass es irgendwo eine Einstellung gibt,
DateTime
mit der der Serializer Objekte mit dernew Date(xxx)
Syntax ausgeben kann . Ich werde versuchen, das herauszufinden.Der zweite Parameter von
JSON.parse()
akzeptiert einereviver
Funktion, in der festgelegt wird, wie der ursprünglich erzeugte Wert vor der Rückgabe erzeugt wird.Hier ist ein Beispiel für das Datum:
Siehe die Dokumente von JSON.parse ()
quelle
parseInt()
. Es weist die Funktion an, eine Ganzzahl im Zahlensystem der Basis 10 zu extrahieren. Es ist ein Radix. Wenn Sie8
dort eingeben, wird eine Oktalzahl extrahiert.Hier ist meine Lösung in Javascript - sehr ähnlich wie bei JPot, aber kürzer (und möglicherweise ein kleines bisschen schneller):
"value.substr (6)" entfernt den Teil "/ Date (", und die Funktion parseInt ignoriert die am Ende vorkommenden Nicht-Zahlenzeichen.
EDIT: Ich habe den Radix absichtlich weggelassen (das 2. Argument für parseInt); siehe meinen Kommentar unten . Beachten Sie außerdem, dass ISO-8601-Daten diesem alten Format vorgezogen werden. Daher sollte dieses Format im Allgemeinen nicht für Neuentwicklungen verwendet werden. In der hervorragenden Json.NET- Bibliothek finden Sie eine großartige Alternative zum Serialisieren von Daten im ISO-8601-Format.
Übergeben Sie für nach ISO-8601 formatierte JSON-Daten einfach die Zeichenfolge an den Date-Konstruktor:
quelle
value.substr(6, 13)
die anderen Nicht-Zahlenzeichen entfernt. Aber wenn Sie das tun, sind alle Daten VOR dem 26.04.1938 ungültig! Wir wussten nicht,parseInt
dass die Nicht- Zahlenzeichen ignoriert werden würden. Vielen Dank!parseInt
sollte führende Nullen ab ECMAScript ed 5 (2011) ignorieren .Es gibt eine ganze Reihe von Antworten, um dies clientseitig zu handhaben, aber Sie können die Ausgabeserverseite ändern, wenn Sie dies wünschen.
Es gibt einige Möglichkeiten, dies zu erreichen. Ich beginne mit den Grundlagen. Sie müssen die JsonResult-Klasse in Unterklassen unterteilen und die ExecuteResult-Methode überschreiben. Von dort aus können Sie verschiedene Ansätze wählen, um die Serialisierung zu ändern.
Ansatz 1: Die Standardimplementierung verwendet den JsonScriptSerializer . Wenn Sie sich die Dokumentation ansehen, können Sie mit der RegisterConverters-Methode benutzerdefinierte JavaScriptConverters hinzufügen . Hierbei gibt es jedoch einige Probleme: Der JavaScriptConverter serialisiert in ein Wörterbuch, dh er nimmt ein Objekt und serialisiert in ein Json-Wörterbuch. Um das Objekt zu einer Zeichenfolge zu serialisieren, ist ein wenig Hackery erforderlich, siehe Beitrag . Dieser spezielle Hack wird auch der Zeichenfolge entkommen.
Ansatz 2 (empfohlen): Der zweite Ansatz besteht darin, mit dem überschriebenen JsonResult zu beginnen und mit einem anderen Json-Serializer zu arbeiten, in meinem Fall dem Json.NET- Serializer. Dies erfordert nicht die Hackerei von Ansatz 1. Hier ist meine Implementierung der JsonResult-Unterklasse:
Anwendungsbeispiel:
Zusätzliche Credits: James Newton-King
quelle
Moment.js ist eine umfangreiche Datetime-Bibliothek, die dies ebenfalls unterstützt. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
Beispiel: Moment ("/ Datum (1198908717056-0700) /")
Es könnte helfen. Plunkerausgang
quelle
moment("json_date_string_value").format('appropriate format');
, können Sie verschiedene Formatwerte auf momet.js Seite sehenIch fand , dass eine neue zu schaffen
JsonResult
und der Rückkehr , dass unbefriedigend ist - unter alle Anrufe ersetzenreturn Json(obj)
mitreturn new MyJsonResult { Data = obj }
ein Schmerz ist.Also dachte ich mir, warum nicht einfach die
JsonResult
Verwendung einesActionFilter
:Dies kann auf jede Methode angewendet werden, die a
JsonResult
zurückgibt, um stattdessen JSON.Net zu verwenden:die mit antworten wird
wie gewünscht!
Wenn es Ihnen nichts ausmacht, den
is
Vergleich bei jeder Anfrage aufzurufen, können Sie Folgendes hinzufügenFilterConfig
:und Ihr gesamtes JSON wird jetzt mit JSON.Net anstelle des integrierten JSON serialisiert
JavaScriptSerializer
.quelle
Verwenden von jQuery zum automatischen Konvertieren von Datumsangaben mit
$.parseJSON
Da Sie Asp.net MVC verwenden, vermute ich, dass Sie jQuery auf der Clientseite verwenden. Ich schlage vor, Sie lesen diesen Blog-Beitrag , der Code
$.parseJSON
zum automatischen Konvertieren von Daten für Sie enthält.Code unterstützt Asp.net-formatierte Daten wie die von Ihnen genannten sowie ISO-formatierte Daten. Alle Daten werden automatisch mit für Sie formatiert
$.parseJSON()
.quelle
Die Ajax-Kommunikation zwischen dem Client und dem Server umfasst häufig Daten im JSON-Format. Während JSON für Zeichenfolgen, Zahlen und Boolesche Werte gut funktioniert, kann es aufgrund der Art und Weise, wie ASP.NET sie serialisiert, zu Schwierigkeiten bei Datumsangaben kommen. Da es keine spezielle Darstellung für Datumsangaben gibt, werden sie als einfache Zeichenfolgen serialisiert. Als Lösung serialisiert der Standard-Serialisierungsmechanismus von ASP.NET Web Forms und MVC Datumsangaben in einer speziellen Form - / Datum (Ticks) / -, wobei Ticks die Anzahl der Millisekunden seit dem 1. Januar 1970 ist.
Dieses Problem kann auf zwei Arten gelöst werden:
Client-Seite
Konvertieren Sie die empfangene Datumszeichenfolge in eine Zahl und erstellen Sie ein Datumsobjekt mit dem Konstruktor der Datumsklasse mit den Häkchen als Parameter.
Serverseite
Die vorherige Lösung verwendet ein clientseitiges Skript, um das Datum in ein JavaScript-Datumsobjekt zu konvertieren. Sie können auch serverseitigen Code verwenden, der .NET DateTime-Instanzen im Format Ihrer Wahl serialisiert. Um diese Aufgabe auszuführen, müssen Sie Ihr eigenes ActionResult erstellen und die Daten dann wie gewünscht serialisieren.
Referenz: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
quelle
Ich hatte das gleiche Problem und anstatt den tatsächlichen Datumswert zurückzugeben, habe ich nur ToString ("TT MMM JJJJ") verwendet. Dann habe ich in meinem Javascript ein neues Datum (Datumswert) verwendet, wobei der Datumswert "01. Januar 2009" sein kann.
quelle
ToString("o")
?Siehe diesen Thread:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
Grundsätzlich ist das
Date()
Format zwar gültiges Javascript, aber KEIN gültiges JSON (es gibt einen Unterschied). Wenn Sie das alte Format verwenden möchten, müssen Sie wahrscheinlich eine Fassade erstellen und den Wert selbst transformieren oder einen Weg finden, um beim Serializer für Ihren Typ in das zu gelangenJsonResult
und ein benutzerdefiniertes Format für Datumsangaben zu verwenden.quelle
Nicht die eleganteste Art, aber das hat bei mir funktioniert:
quelle
Ich habe an einer Lösung für dieses Problem gearbeitet, da mir keine der oben genannten Antworten wirklich geholfen hat. Ich arbeite mit dem jquery-Wochenkalender und benötigte meine Daten, um Zeitzoneninformationen auf dem Server und lokal auf der Seite zu haben. Nachdem ich mich ein bisschen umgesehen hatte, fand ich eine Lösung, die anderen helfen könnte.
Ich verwende asp.net 3.5 im Vergleich zu 2008, asp.net MVC 2 und den jquery-Wochenkalender.
Erstens verwende ich eine von Steven Levithan geschriebene Bibliothek, die beim Umgang mit Daten auf der Client-Seite hilft, Steven Levithans Datumsbibliothek . Das isoUtcDateTime-Format ist perfekt für das, was ich brauchte. In meinem AJAX-Aufruf von jquery verwende ich die Formatfunktion, die mit der Bibliothek im isoUtcDateTime-Format bereitgestellt wird. Wenn der Ajax-Aufruf meine Aktionsmethode trifft, wird die Datetime-Art auf lokal gesetzt und spiegelt die Serverzeit wider.
Wenn ich Daten über AJAX an meine Seite sende, sende ich sie als Textzeichenfolgen, indem ich die Daten mit "TTT, TT MMM JJJJ HH ':' MM ':' SS 'GMT'zzzz" formatiere. Dieses Format kann problemlos clientseitig konvertiert werden
Hier ist meine Komplettlösung abzüglich der Quelle von Steve Levithan, die Sie herunterladen können:
Regler:
Javascript:
Ich hoffe, dieses kurze Beispiel hilft anderen in der gleichen Situation, in der ich mich befand. Derzeit scheint es sehr gut mit der Microsoft JSON-Serialisierung zu funktionieren und meine Daten über Zeitzonen hinweg korrekt zu halten.
quelle
Der bessere Weg, um mit Daten in Knockoutjs umzugehen, besteht darin, die Moment-Bibliothek zu verwenden und Daten wie Boss zu behandeln. Sie können problemlos mit Daten wie / Date (-62135578800000) / umgehen. Sie müssen sich nicht darum kümmern, wie Ihr Serialisierungsdatum im Controller ist.
benutze es wie
momentjs unterstützt viele Datums- / Uhrzeitformate und Dienstprogrammfunktionen für Datumsangaben.
quelle
Formatieren Sie das Datum innerhalb der Abfrage.
Das einzige Problem bei dieser Lösung ist, dass Sie keine Ergebnisse erhalten, wenn einer der Datumswerte null ist. Um dies zu umgehen, können Sie entweder bedingte Anweisungen in Ihre Abfrage einfügen, BEVOR Sie das Datum auswählen, bei dem Datumsnullwerte ignoriert werden, oder Sie können eine Abfrage einrichten, um alle Ergebnisse abzurufen, und dann alle diese Informationen mithilfe einer foreach-Schleife durchlaufen und einen Wert zuweisen zu allen Daten, die null sind, BEVOR Sie Ihre SELECT neu machen.
Beispiel für beides:
Die zweite Option erfordert eine weitere Abfrage, damit Sie allen Nullen Werte zuweisen können. Dies und die foreach-Schleife müssten VOR Ihrer Abfrage sein, die die Werte auswählt.
Nur eine Idee, die ich einfacher fand als alle Javascript-Beispiele.
quelle
Sie können diese Methode verwenden:
quelle
0
In Ihrem cshtml,
In Ihrer JS-Datei möglicherweise app.js,
Fügen Sie außerhalb von app.controller den folgenden Filter hinzu.
Hier ist das "mydate" die Funktion, die Sie zum Parsen des Datums aufrufen. Hier ist die "App" die Variable, die das angle.module enthält
quelle
füge jquery ui plugin zu deiner Seite hinzu.
quelle
Nicht umsonst, aber es gibt einen anderen Weg. Erstellen Sie zunächst Ihre LINQ-Abfrage. Erstellen Sie dann eine Abfrage des Aufzählungsergebnisses und wenden Sie die für Sie geeignete Formatierung an.
Ich muss sagen, der zusätzliche Schritt ist nervig, aber es funktioniert gut.
quelle
Für mich funktionierte es, ein Ansichtsmodell zu erstellen, das die Datumseigenschaft als Zeichenfolge enthielt. Zuweisen der DateTime-Eigenschaft aus dem Domänenmodell und Aufrufen von .ToString () für die date-Eigenschaft, während der Wert dem Ansichtsmodell zugewiesen wird.
Ein JSON-Ergebnis einer MVC-Aktionsmethode gibt das Datum in einem mit der Ansicht kompatiblen Format zurück.
Modell anzeigen
Domänenmodell
Controller-Aktionsmethode
quelle
Überschreiben Sie die Controller Json / JsonResult, um JSON.Net zurückzugeben:
Das ist ein Vergnügen
quelle
Ärgerlich, nicht wahr?
Meine Lösung bestand darin, meinen WCF-Dienst so zu ändern, dass DateTimes in einem besser lesbaren Format (nicht von Microsoft) zurückgegeben wird. Beachten Sie unten das "
UpdateDateOriginal
", das das Standardformat für Datumsangaben von WCF ist, und mein "UpdateDate
", das so formatiert ist, dass es besser lesbar ist.So geht's:
Ändern des WCF-Datumsformats
Hoffe das hilft.
quelle
Ich fand, dass dies der einfachste Weg ist, es serverseitig zu ändern.
quelle
Ich hatte eine Reihe von Problemen mit JSON-Daten und beschloss, das Problem einfach zu beseitigen, indem ich das Datumsproblem in SQL ansprach. Ändern Sie das Datumsformat in ein Zeichenfolgenformat
Durch die Verwendung von fldDateStr verschwand das Problem und ich konnte das Datumsfeld weiterhin zum Sortieren oder für andere Zwecke verwenden.
quelle
Es gibt das Server-Datumsformat zurück. Sie müssen Ihre eigene Funktion definieren.
quelle
Hier ist ein JavaScript-Code, den ich geschrieben habe und der einen
<input type="date">
Wert von einem Datum festlegt, das von ASP.NET MVC übergeben wurde.Sie nennen diese Funktion folgendermaßen:
Wo
commissionStartDate
ist das von MVC übergebene JSON-Datum?quelle
Das einfachste:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = neues Datum (milisegundos). toLocaleDateString ("en-UE");
quelle