2011-12-14 86 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; } 
} 

我想將Model.SearchResult轉換爲JSON對象。 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對象?

+0

請參閱http:// stackoverflow。COM /問題/ 3365551/ASP淨MVC-如何對轉換 - 視圖 - 模型 - 到 - JSON對象 – 2011-12-14 09:36:28

回答

61

嘗試使用這種方法:

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

+1

+1這是簡單和容易 – Vamsi 2013-03-05 06:20:25

34

我用這個幫手,因爲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)); 
} 

並在視圖:

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

我應該用JSON.Encode(..)現在,像mentionned取代串行在Hemant的引用中。 (它使用自己的JavaScriptSerializer)。

問題的根源在於HTML編碼JSON的「@」。您可以使用@ Html.Raw(..)來避免此行爲。

+:看看爲Json.Net http://json.codeplex.com/

JSON.Net更新

我已經與JSON.net(更好)更新了輔助前一陣子。

似乎有些用戶繼續閱讀,upvote和使用舊的代碼。我希望他們使用更好的方式,使用下面的新版本,或者使用NGon(如Matthew Nichols)已在註釋中注意到它。

下面的代碼:

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

我通常會建立口岸(https://github.com/brooklynDev/NGon)對於這種但如果我只是在一個地方使用這是一個很好的解決方案。 – 2013-03-15 17:20:38

+0

不知道ngon,謝謝你的提示! – 2013-03-27 16:23:14

1

這是一個更新到我原來的答覆,我會承認,由於堅持糾纏的結果@Tyrsius:D拒絕放棄我不能從我的.js庫中的單獨文件中訪問我的MVC 5 cshtml頁面中的<script>標記中創建的變量的事實,我發現如果將腳本標記放在@部分腳本語句nt阻止瓦爾斯在那裏創建的全局作用域,並可用於我的插件小部件。我還沒有在我的任何更復雜的應用程序中使用它,但是在另一個應用程序的protoType中使用它,答案如下。現在@ Html.Raw(...)起作用,我能夠序列化一個可以立即使用的對象。

這件事我會從現在開始使用......再次感謝掛在那裏與我@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") 
    } 

下面的代碼是在一個單獨的js文件

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