2011-12-14 19 views
32

Voglio convertire un oggetto .Net in JSON nella vista. Il mio modello è vista come questo,Converti Oggetto .Net in oggetto JSON nella vista

public class ViewModel{ 
    public SearchResult SearchResult { get; set;}  
}  

public class SearchResult { 
    public int Id { get; set; } 
    public string Text{ get; set; } 
} 

voglio convertire Model.SearchResult in un oggetto JSON. Currenty sto facendo in questo modo:

System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
//.... 
var s = @serializer.Serialize(Model.Institution); 

ma il risultato è come questo,

var s = { "Name":"a","Id":1}; 
Create:228Uncaught SyntaxError: Unexpected token & 

Come posso convertire questo correttamente a un oggetto JSON?

+0

fare riferimento a http: // StackOverflow.it/questions/3365551/asp-net-mvc-how-to-convert-view-model-in-json-object –

risposta

61

Prova con questo metodo:

@Html.Raw(Json.Encode(Model.Content))

+1

+1 è semplice e facile – Vamsi

+0

C'è un modo per cambiare il serializzatore Json.Encode predefinito su JSON.NET? –

+0

Se si usa google '.net default json serializer', troverai un sacco di link per fare esattamente questo. – Tyrsius

34

Io uso questo helper dal 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)); 
} 

E nella vista:

<script> 
    var s = @(Html.ToJson(Model.Content)); 
    </script> 

devo sostituire serializzatore con il JSON.Encode (..) ora, come menzionate nel riferimento di Hemant. (Si utilizza JavaScriptSerializer).

L'origine del problema è la "@" codifica HTML del JSON. È possibile utilizzare @ Html.Raw (..) per evitare questo comportamento.

+: date un'occhiata per Json.Net http://json.codeplex.com/

JSON.Net aggiorno

Ho aggiornato l'aiutante qualche tempo fa con JSON.net (molto meglio).

Sembra che alcuni utenti continuino a leggere, upvotare e utilizzare il vecchio codice. Mi piacerebbe che usassero un modo migliore, con la nuova versione di seguito, o usando NGon come Matthew Nichols lo ha notato in un commento.

Ecco il codice:

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)); 
    } 
    } 
} 
+1

Normalmente ho impostato NGon (https://github.com/brooklynDev/NGon) per questo tipo di cosa ma se sto usando solo in un punto questa è una bella soluzione. –

+0

Non sapevo ngon, grazie per il suggerimento! –

1

Questo è un aggiornamento per la mia risposta originale e devo ammettere che, a seguito della badgering insistente di @Tyrsius: D che si è rifiutato di rinunciare al fatto che non potevo accedere ai var creati nei tag <script> nella mia pagina cshtml MVC 5 dalle mie librerie .js in file separati, ho scoperto che se avessi inserito i tag dello script all'interno di @ script di sezione stateme nt blocca che i vars creati lì abbiano reso l'ambito globale ed erano disponibili per i miei widget di plugin. Non l'ho ancora usato in nessuna delle mie app più complesse, ma l'ho usato in un protoType di un'altra app e la risposta è sotto. Ora @ Html.Raw (...) funziona e sono stato in grado di serializzare un oggetto che potrei immediatamente utilizzare.

Questo è qualcosa che userò da ora in poi ... grazie ancora per appendere in là con me @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") 
    } 

Il seguente codice è in un js separati file di

$(document).ready(function() { 
    alert(JSON.stringify(testVar)); 
}); 
+0

Questo è un interessante "gotcha" che non ho incontrato prima, grazie per averlo incluso =) – Tyrsius

+1

Grazie per spingere ... mi ha fatto fare il lavoro per trovare una soluzione migliore ... nota il leggero credito della mano che ti ho dato ... – Clarence