ASP.NET MVC, Json.Encode() DateTime-Codierung Problem nicht der Zeichenfolge Datum Typ
Ich habe ein Problem mit dem JavaScript-Code, der erzeugt wird, indem ASP.NET MVC ist System.Web.Helpers.Json.Encode()
wenn das Modell umfasst eine DateTime
Eigenschaft.
Mein Modell:
public class MyViewModel
{
public string MyString { get; set; }
public DateTime MyDateTime { get; set; }
public int MyInt { get; set; }
public string[] MyStringArray { get; set; }
}
Mein Controller:
public ActionResult Index()
{
var myViewModel = new MyViewModel();
myViewModel.MyString = "My test string";
myViewModel.MyInt = 100;
myViewModel.MyDateTime = DateTime.Now;
myViewModel.MyStringArray = new string[] { "string 1", "string 2" };
return View(myViewModel);
}
Meiner Sicht:
<script type="text/javascript">
var myViewModel = @Html.Raw(Json.Encode(Model)) ;
</script>
Die Ausgabe:
<script type="text/javascript">
var myViewModel = {"MyString":"My test string","MyDateTime":"\/Date(1372280916431)\/","MyInt":100,"MyStringArray":["string 1","string 2"]} ;
</script>
Das Problem ist mit der Art, wie das Datum kodiert wird. Es ist ein string und kein Datum geben.
Habe ich auch versucht, mit Hilfe Newtonsoft.Json.JsonConvert.SerializeObject()
und ich bekomme immer noch ein string und kein Datum geben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Verhalten ist by design.
JSON (im Gegensatz zu Javascript) nicht haben ein Termin geben.
replacer
callback zu verarbeiten stringification:JSON.stringify(value[, replacer[, space]])
), binden Sie diese Mitglieder richtig. JSON.NET kann dann zu interpretieren und wiederzubeleben Objekte mit starken Typen, solange diese Typen existieren, die auf der server-Seite. Realisieren Sie Ihr eigenes type-mapping Schema (habe ich getan intermediate Typen, template-Typen-namespace, spiegelung, etc.), gebaut in JSON.NET. Es ist einfacher in AS3 aufgrund der starken Typen, die im Gegensatz zu JavaScript.{$ref:id}
im string. Wieder, das ist einfacher in Flash/AS3, weil es tatsächlich unterstützt die Objekt-Referenzen als Schlüssel in der Dictionary-Klasse, während JavaScript nicht. JavaScript konvertiert alle Tasten Streicher, die ist nutzlos für Objekte. Der einzige workaround, bis der standard holt mit AS3, ist Objekt überschreiben.Prototyp geben jedem Objekt eine eindeutige string-ID sehr früh.Datum Typ hat keine Literale in JavaScript. Sie wird durch den Aufruf des Konstruktors.
Können Sie
oder
Beide ignoriert die '/Date(' Teil und mit "parseInt" Sie ignorieren die letzten ')/' Teil. Dann erhalten Sie mit dem date-Objekt von Millisekunden.
Aber vergessen Sie nicht, dass, wenn Sie erstellen Date() Objekt erstellt, ist es je nach Browser die GMT-Zeit.
Wenn mit diesem Datum () - Objekt in meinem javascript-code, den ich verwenden Sie immer die UTC-Datum und-Methoden wie:
myDate.getUTCHours();
Zeichnung inspiration aus diesen Antworten, die ich brauchte, um an meinem nullable Datum zu einem MVC-controller und it-Modell gebunden richtig. Dies ist, wo ich gelandet:
Mit der Forloop.HtmlHelpers nuget-Paket erhalten Sie die AddScriptBlock HtmlHelper-Erweiterung und tun Sie etwas wie dieses mit der Newtonsoft-Aufruf auf eine variable im Skript:
}