2011-12-14 14 views
32

.NetオブジェクトをビューのJSONに変換します。私の見解モデルは ビュー内の.NetオブジェクトをJSONオブジェクトに変換します。

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

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

私はJSONオブジェクトにで Model.SearchResultを変換する、このようなものです。 Currenty私はこのようにそれをやっている:

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

が、結果は

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

がどのように私はJSONオブジェクトには、この正しく変換することができ、このようなものですか?

私は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)); 
} 

とビューであるため、このヘルパーを使用

+0

http:// stackoverflowを参照してください。com/questions/3365551/asp-net-mvc-how-to-convert-view-model-json-object –

答えて

61

は、このメソッドを使用してみてください:

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

+1

+1シンプルで簡単です – Vamsi

+0

デフォルトのJson.EncodeシリアライザをJSON.NETに変更する方法はありますか? –

+0

Googleの '.net default json serializer'をグーグルすれば、正確にそれをするためのたくさんのリンクが見つかります。 – Tyrsius

34

:私はmentionnedのように、今JSON.Encode(..)とシリアライザを置き換える必要があり

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

ヘマントによって参照される。 (JavaScriptSerializer自体を使用します)。

問題の原因は、HTMLがJSONをエンコードする「@」です。 @ Html.Raw(..)を使用すると、この動作を回避できます。

+:私はJSON.net(より良い)でしばらく前にヘルパーを更新しました

更新Json.Net http://json.codeplex.com/

JSON.Netために見てみましょう。

一部のユーザーは古いコードを読んでアップヴォートして使用しているようです。私は彼らがより良い方法を、下の新しいバージョンで、またはMatthew NicholsのようなNGonを使用してコメントに気づいた使用したいと思います。ここで

はコードです:

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

私は通常このような種類のNGon(https://github.com/brooklynDev/NGon)を設定していますしかし、もし私がちょうど1つの場所で使っているのなら、これは素晴らしい解決策です。 –

+0

ngonを知らなかった、チップをありがとう! –

1

これが私の元の答えに更新され、私は執拗badgeringの結果として、それを認めますよ@Tyrsius:D私のMVC 5 cshtmlページの<script>タグで作成されたバールに別のファイルでアクセスすることができなかったという事実をあきらめることを拒否したDは、セクションスクリプトstatemeそこに作成されたvarsがグローバルスコープを作成し、プラグインウィジェットで利用できるようになりました。私はまだ複雑なアプリの中で使っていませんが、プロトタイプの別のアプリで使っています。その答えは以下のとおりです。今@ Html.Raw(...)が動作し、すぐに使用できるオブジェクトを直列化することができました。

この

は、次のコードは、別の.jsファイルです

@section scripts 
    { 
    <script type="text/javascript"> 
     @using MRTCProtoType.Models.ControllerData.Contracts 

     var testVar = @Html.Raw(JsonConvert.SerializeObject(WMMWorkloadTestData.getWorkloadTestData())); 
    </script> 
     @Scripts.Render("~/bundles/homeworkflow") 
    } 

@Tyrsius私と一緒にそこに掛けるため再び...おかげで私は今から使用するものです

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

これは興味深い「つかまえ」です。私はこれまでに取り組まなかったことです。それを含めてくれてありがとうございます。) – Tyrsius

+1

ナッジに感謝します。はるかに良い解決策を見つけるために...私は笑を与えた手の信じのわずかに気づく... – Clarence

関連する問題