MVC 4 Einzelseitenanwendung und DateTime

8

Als ich mit den neuen Single-Page-Anwendungen von MVC 4 herumspielte, bemerkte ich, dass keines der Beispiele, die ich gefunden habe, ein Beispiel für eine DateTime enthält, die über den WebApi aktualisiert wird. Ich habe bald herausgefunden warum.

Ich habe mit der Erstellung des Standard-SPA aus der Vorlage begonnen. Ich habe dann TodoItem.cs geöffnet und ein DateTime-Feld hinzugefügt. Dann habe ich den Controller wie von den Kommentaren angewiesen generiert. (Ohne das Datetime-Feld funktioniert alles gut).

Nachdem alles generiert wurde, startete ich die App und navigierte zum Controller-Index (ich nannte den Controller "Tasks"). Ich habe die Gitterseite mit 0 Datensätzen wie erwartet erhalten und auf die Schaltfläche Hinzufügen geklickt. Ich wurde wie erwartet zur Bearbeitungsseite geführt und einige Daten einschließlich eines Datums in mein glänzendes neues Datum-Zeit-Feld eingegeben. Klicken Sie dann auf Speichern.

Es wurde ein Fehler erzeugt, der besagt:

  

Serverfehler: HTTP-Statuscode: 500, Nachricht: Beim Deserialisieren des Objekts vom Typ System.Web.Http.Data.ChangeSetEntry [] ist ein Fehler aufgetreten. DateTime-Inhalt '01 / 01/2012 'beginnt nicht mit' / Datum ('und endet mit') / 'wie für JSON erforderlich.

Es scheint, dass das Tooling DateTime noch nicht unterstützt. Ich bin mir sicher, ich könnte durchgehen und ein wenig Zeit damit verbringen, es herauszufinden und es zur Arbeit zu bringen, aber ich dachte, ich könnte hier etwas Glück mit jemandem finden, der dieses Problem bereits behoben hat und Einblick geben kann.

>

Hat schon jemand gekämpft?

Update: Ich füge weitere Informationen hinzu, die ich gefunden habe, seit ich das gefragt habe. Ich habe versucht, JSON.Net als mein Formatierer wie unten vorgeschlagen zu verwenden. Ich denke, das wird die letztendliche Lösung sein, aber das tun, wie das unten angegebene Poster nicht genug ist.

Bei Verwendung des JSON.Net-Serialisierers erhalte ich den folgenden Fehler:

  

Dieser DataController unterstützt die Operation 'Update' für die Entität 'JObject' nicht.

Der Grund ist, dass JSON.Net das Objekt, zu dem das Formatierungsprogramm versucht, zu deserailisieren, nicht vollständig füllt (System.Web.Http.Data.ChangeSet).

Der JSON, der gesendet wird, ist:

%Vor%

Der eingebaute Json-Formatierer ist in der Lage, diesen Json in ein ChangeSet-Objekt mit eingebetteten TodoItem-Objekten in den Feldern Entity und OriginalEntity zu rekonstituieren.

Hat jemand JSON.Net dazu gebracht, das richtig zu deserialisieren?

    
Brian McCord 27.02.2012, 22:56
quelle

4 Antworten

3

Das Problem besteht darin, dass die ASP.NET-Web-API in der aktuellen Betaversion DataContractJsonSerializer verwendet, was bekannte Probleme mit der Serialisierung von DateTime hat. Hier ist ein kürzlich aufgetretener Fehler Microsoft Connect für das Problem; MS antwortet, dass sie bereits einen Fehler haben, der das Problem verfolgt, aber es wird nicht im .Net 4.5 / VS11 Zeitrahmen behoben.

Glücklicherweise können Sie einen alternativen JSON-Serializer ersetzen, z. B. James Newton-King ausgezeichnet JSON.Net .

Henrik Nielsen vom ASP.NET-Team hat eine ausgezeichnete Blog Post zeigt, wie Sie JSON.Net mit ASP.NET Web API verwenden können. Hier ist seine Implementierung eines MediaTypeFormatter , das JSON.Net verwendet (es müsste auch mit der ASP.NET-Web-API-Konfiguration verbunden sein, Henriks Blog demonstriert das ebenfalls).

%Vor%     
James Webster 28.02.2012, 00:02
quelle
1

Ich hatte genau das gleiche Problem. Ich habe zu viel Zeit damit verbracht, json.net zur Arbeit zu bringen. Ich kam schließlich mit dieser Problemumgehung, die Sie in TodoItemsViewModel.js im Beispielprojekt beibehalten würden:

%Vor%

Die umgebenden Codezeilen wurden für den Kontext eingefügt. Ich fand das in den Kommentaren unter: Ссылка

Sie möchten auch das HTML in _Editor.cshtml ändern, um an "DateJson" zu binden, nicht an "EnterDate"

Dies ist sicherlich ein Klud, aber es hat die Tugend zu arbeiten, was keine kleine Leistung ist.

    
SteveK 13.04.2012 23:05
quelle
1

Sie können auch das JQuery-Kalender-Popup verwenden, indem Sie den folgenden Code hinzufügen.

Fügen Sie dies am unteren Rand von TodoItemsViewModel.js im Beispiel MVC 4 SPA-Projekt hinzu:

%Vor%

So würde Ihr _Editor.cshtml-Code aussehen, um an den Datepicker zu binden

%Vor%

Außerdem möchten Sie die auf der Seite _Grid.cshtml angezeigte Variable von "EnterDate" in "DateJson" ändern.

    
SteveK 14.04.2012 01:44
quelle
0

JSON.NET erwartet $ type, während Sie __type haben, um den Entity-Typ so zu dekomprimieren, dass er in ein JObject konvertiert wird.

Ich habe es mit dem folgenden klunk

geschafft Stellen Sie zuerst sicher, dass JsonSerializerSettings has .TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;

Schreiben Sie dann Ihren eigenen '' '' JsonTextReader

%Vor%

und verwenden Sie es, um den JSON mit '' 'zu deserialisieren, indem Sie (MyJsonTextReader jsonTextReader = new MyJsonTextReader (streamReader))

verwenden     
Giles Bradshaw 05.04.2012 18:55
quelle