2013-06-26 11 views
9

Ho un problema con il codice JavaScript prodotto da ASP.NET MVC System.Web.Helpers.Json.Encode() se il modello include una proprietà DateTime.ASP.NET MVC Json.Encode() Tipo di stringa di codifica DateTime non data tipo

il mio modello:

public class MyViewModel 
{ 
    public string MyString { get; set; } 
    public DateTime MyDateTime { get; set; } 
    public int MyInt { get; set; } 
    public string[] MyStringArray { get; set; } 
} 

mio 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); 
} 

mio punto di vista:

<script type="text/javascript"> 

    var myViewModel = @Html.Raw(Json.Encode(Model)) ; 

</script> 

l'output:

<script type="text/javascript"> 

    var myViewModel = {"MyString":"My test string","MyDateTime":"\/Date(1372280916431)\/","MyInt":100,"MyStringArray":["string 1","string 2"]} ; 

</script> 

Il problema riguarda il modo in cui la data viene codificata. È una stringa e non un tipo di data.

Ho anche provato a utilizzare Newtonsoft.Json.JsonConvert.SerializeObject() e ottengo ancora una stringa e non un tipo di data.

risposta

2

Questo comportamento è di progettazione.

JSON (a differenza di Javascript) non ha un tipo di data.

+0

È possibile aggiungere tipi includendo un membro di tipo $ e può conservare riferimenti e riferimenti ciclici tramite i membri $ id e $ ref. Usando un callback personalizzato 'replacer' per gestire la stringa:' JSON.stringify (value [, replacer [, space]]) '), puoi incorporare correttamente questi membri. JSON.NET può quindi interpretare e ravvivare oggetti con tipi forti, purché tali tipi esistano sul lato server.È possibile implementare il proprio schema di mappatura dei tipi (ho fatto tipi intermedi, tipi di template, mirroring dei namespace, ecc.), Incorporato in JSON.NET. È più semplice in AS3 a causa dei tipi forti, a differenza di JavaScript. – Triynko

+0

Per incorporare i riferimenti, si aggiungono oggetti a un hash mentre vengono rilevati. Controllate sempre l'hash per vedere se l'oggetto è già stato serializzato, e se lo ha, allora prendete l'ID dall'hash e incorporate semplicemente un '{$ ref: id}' nella stringa. Di nuovo, questo è più semplice in Flash/AS3 perché in realtà supporta i riferimenti agli oggetti come chiavi nella sua classe Dizionario, mentre JavaScript no. JavaScript converte tutte le chiavi in ​​stringhe, che è inutile per gli oggetti. L'unica soluzione alternativa fino a quando lo standard raggiunge AS3, consiste nell'override di object.prototype per fornire a ogni oggetto un ID stringa univoco molto presto. – Triynko

8

Date tipo non ha letterali in JavaScript. Dovrai chiamare il suo costruttore.

var myDate = new Date(@Html.Raw(Json.Encode(Model.MyDateTime))); 
2

È possibile utilizzare

var myDate = new Date(parseInt('@Html.Raw(Json.Encode(Model.MyDateTime))'.substr(6))); 

o

var myDate = new Date(parseInt('@Html.Raw(Json.Encode(Model.MyDateTime))'.replace('/Date(', ''))); 

Sia ignora il '/ Data (' parte e con "parseInt" si sta ignorando l'ultimo ') /' parte. Quindi ottenere l'oggetto data da millisecondi.

Ma non dimenticare che quando si crea l'oggetto Date() viene creato in base all'ora GMT del browser.

Quando si utilizza questa Date() oggetto nel mio codice javascript Io uso sempre metodi UTC Data come: myDate.getUTCHours();

0

Utilizzando le Forloop.HtmlHelpers NuGet pacchetto è possibile ottenere l'estensione AddScriptBlock HtmlHelper e fare qualcosa di simile con il Newtonsoft chiamano per impostare una variabile nello script:

@{ 
using (var context = Html.BeginScriptContext()) 
{ 
    Html.AddScriptBlock(@" 
$(function() { 
     var data = " + JsonConvert.SerializeObject(Model.Data) + @"; 
     ///continue processing ... 
});"); 
} 

}

2

Traendo ispirazione da queste risposte, avevo bisogno di passare la mia data nullable a un controller MVC e lo hanno legato modello correctl y. Qui è dove sono atterrato:

var dob = @Html.Raw(Json.Encode(Model.BirthDate.HasValue ? Model.BirthDate.Value.ToShortDateString() : null)); 
Problemi correlati