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.
È 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
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