2011-12-14 8 views
32

Chcę przekonwertować obiekt .Net na JSON w widoku. Moim zdaniem model jest tak,Konwersja obiektu .Net do obiektu JSON w widoku

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

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

chcę przekonwertować Model.SearchResult do obiektu JSON. CurrentY robię to tak:

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

ale wynik jest podobny do tego,

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

Jak mogę przekonwertować to poprawnie do obiektu JSON?

+0

przeczytaj http: // stackoverflow.com/questions/3365551/asp-net-mvc-how-to-convert-view-model-into-json-object –

Odpowiedz

61

Spróbuj użyć tej metody:

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

+1

+1 to proste i łatwe – Vamsi

+0

Czy istnieje sposób na zmianę domyślnego serializera Json.Encode na JSON.NET? –

+0

Jeśli masz google '.net default json serializer' znajdziesz mnóstwo linków do zrobienia właśnie tego. – Tyrsius

34

Używam tego pomocnika od 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)); 
} 

I w widoku:

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

należy wymienić serializatora z JSON.Encode (..) teraz, jak wymieniono w poleceniu przez Hemanta. (Wykorzystuje sam JavaScriptSerializer).

Źródłem problemu jest "@" kod HTML kodu JSON. Możesz użyć @ Html.Raw (..), aby uniknąć tego zachowania.

+: spójrz na Json.NET http://json.codeplex.com/

Json.NET aktualizować

zaktualizowałem pomocnika jakiś czas temu z Json.NET (znacznie lepiej).

Wygląda na to, że niektórzy użytkownicy nadal czytają, odtwarzają i używają starego kodu. Chciałbym, aby korzystali z lepszej metody, z nową wersją poniżej lub przy użyciu NGon, takiej jak Matthew Nichols, która zauważyła to w komentarzu.

Oto kod:

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

Zazwyczaj konfiguruję NGon (https://github.com/brooklynDev/NGon) dla tego rodzaju rzecz, ale jeśli używam tylko w jednym miejscu, jest to dobre rozwiązanie. –

+0

Nie wiem ngon, dzięki za napiwek! –

1

Jest to aktualizacja do mojego oryginalnego odpowiedź i muszę przyznać, że wskutek upartego badgering @Tyrsius: D, który odmówił rezygnacji z faktu, że nie mogłem uzyskać dostępu do vars utworzonych w tagach <script> na mojej stronie csht MVC 5 z moich bibliotek .js w osobnych plikach, odkryłem, że jeśli umieściłem tagi skryptów wewnątrz @ sekcja statystyka skryptów Zablokuj, że utworzone tam vary tworzą globalny zasięg i są dostępne dla moich widgetów wtyczek. Wcześniej nie używałem go w żadnej z moich bardziej złożonych aplikacji, ale użyłem go w protoType innej aplikacji, a odpowiedź jest poniżej. Teraz @ Html.Raw (...) działa i udało mi się serializować obiekt, który mógłbym natychmiast użyć.

To jest coś będę używał od teraz ... Jeszcze raz dziękuję za wisi tam ze mną @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") 
    } 

Poniższy kod znajduje się w oddzielnym pliku js

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

To jest interesująca "gotcha", na którą nie natknąłem się wcześniej, dziękuję za jej uwzględnienie =) – Tyrsius

+1

Dzięki za podpowiedź ... dzięki temu mogłem wykonać pracę aby znaleźć o wiele lepsze rozwiązanie ... zauważ delikatne dłonie, które podałem u lol ... – Clarence

Powiązane problemy