Je souhaite convertir un objet .Net au format JSON dans la vue. Mon modèle de vue est comme ça,
public class ViewModel{
public SearchResult SearchResult { get; set;}
}
public class SearchResult {
public int Id { get; set; }
public string Text{ get; set; }
}
Je souhaite convertir Model.SearchResult
en un objet JSON. Currenty je le fais comme ça:
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
//....
var s = @serializer.Serialize(Model.Institution);
mais le résultat est comme ça,
var s = { "Name":"a","Id":1};
Create:228Uncaught SyntaxError: Unexpected token &
Comment puis-je convertir cela correctement en un objet JSON?
J'utilise cet assistant depuis asp.net mvc 2
public static MvcHtmlString ToJson(this HtmlHelper html, object obj)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
return MvcHtmlString.Create(serializer.Serialize(obj));
}
public static MvcHtmlString ToJson(this HtmlHelper html, object obj, int recursionDepth)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.RecursionLimit = recursionDepth;
return MvcHtmlString.Create(serializer.Serialize(obj));
}
Et dans la vue:
<script>
var s = @(Html.ToJson(Model.Content));
</script>
Je devrais remplacer le sérialiseur par le JSON.Encode (..) maintenant, comme indiqué dans la référence de Hemant. (Il utilise lui-même JavaScriptSerializer).
La source de votre problème est le "@" qui code HTML pour le JSON. Vous pouvez utiliser @ Html.Raw (..) pour éviter ce problème.
+: jetez un coup d'œil à Json.Net http://json.codeplex.com/
Mise à jour JSON.Net
J'ai mis à jour l'assistant il y a quelque temps avec JSON.net (bien mieux).
Il semble que certains utilisateurs continuent à lire, à voter et à utiliser l'ancien code. J'aimerais qu'ils utilisent un meilleur moyen, avec la nouvelle version ci-dessous, ou en utilisant NGon like Matthew Nichols l'a remarqué dans un commentaire.
Voici le code:
using System;
using Newtonsoft.Json;
namespace System.Web.Mvc
{
public static class HtmlHelperExtensions
{
private static readonly JsonSerializerSettings settings;
static HtmlHelperExtensions()
{
settings = new JsonSerializerSettings();
// CamelCase: "MyProperty" will become "myProperty"
settings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
}
public static MvcHtmlString ToJson(this HtmlHelper html, object value)
{
return MvcHtmlString.Create(JsonConvert.SerializeObject(value, Formatting.None, settings));
}
}
}
Ceci est une mise à jour de ma réponse initiale et j'admettrai qu'en raison du harcèlement persistant de @Tyrsius: D qui a refusé d'abandonner le fait que je ne pouvais pas accéder aux vars créés avec les balises <script>
dans ma page cshtml MVC 5 à partir de Mes bibliothèques .js dans des fichiers séparés, j'ai découvert que si je plaçais les balises de script dans le bloc d'instructions de scripts @section créé par les vars, la portée globale était disponible pour mes widgets de plug-in. Je ne l'ai pas encore utilisé dans mes applications les plus complexes, mais je l'ai utilisé dans un protoType d'une autre application et la réponse est ci-dessous. Maintenant, @ Html.Raw (...) fonctionne et j'ai pu sérialiser un objet que je pouvais utiliser immédiatement.
C’est quelque chose que je vais utiliser à partir de maintenant ... merci encore d’avoir passé du temps avec moi @Tyrsius
@section scripts
{
<script type="text/javascript">
@using MRTCProtoType.Models.ControllerData.Contracts
var testVar = @Html.Raw(JsonConvert.SerializeObject(WMMWorkloadTestData.getWorkloadTestData()));
</script>
@Scripts.Render("~/bundles/homeworkflow")
}
Le code suivant est dans un fichier .js séparé
$(document).ready(function() {
alert(JSON.stringify(testVar));
});