2011-12-14 47 views
32

Tôi muốn chuyển đổi đối tượng .Net sang JSON trong chế độ xem. Mô hình chế độ xem của tôi giống như thế này,Chuyển đổi đối tượng .Net sang đối tượng JSON trong chế độ xem

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

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

Tôi muốn chuyển đổi Model.SearchResult sang đối tượng JSON. Currenty tôi đang làm nó như thế này:

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

nhưng kết quả là như thế này,

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

Làm thế nào tôi có thể chuyển đổi này một cách chính xác vào một đối tượng JSON?

+0

tham khảo http: // stackoverflow.com/questions/3365551/asp-net-mvc-cách-to-convert-view-model-into-json-object –

Trả lời

61

Hãy thử sử dụng phương pháp này:

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

+1

+1 đó là đơn giản và dễ dàng – Vamsi

+0

Có cách nào để thay đổi mặc định Json.Encode serializer để JSON.NET? –

+0

Nếu bạn google '.net mặc định json serializer' bạn sẽ tìm thấy một tấn các liên kết để làm chính xác điều đó. – Tyrsius

34

tôi sử dụng helper này kể từ 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)); 
} 

Và trong giao diện:

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

tôi nên thay thế serializer với JSON.Encode (..) bây giờ, như mentionned trong phần giới thiệu của Hemant. (Nó sử dụng chính nó JavaScriptSerializer).

Nguồn của sự cố của bạn là "@" HTML mã hóa JSON. Bạn có thể sử dụng @ Html.Raw (..) để tránh hành vi này.

+: có một cái nhìn cho Json.Net http://json.codeplex.com/

JSON.Net cập nhật

tôi đã cập nhật các helper một thời gian trước với JSON.net (tốt hơn).

Dường như một số người dùng tiếp tục đọc, cập nhật và sử dụng mã cũ. Tôi muốn họ sử dụng một cách tốt hơn, với phiên bản mới bên dưới hoặc bằng cách sử dụng NGon như Matthew Nichols đã nhận thấy điều đó trong nhận xét.

Dưới đây là các mã:

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

Tôi thường thiết lập NGon (https://github.com/brooklynDev/NGon) cho loại nhưng nếu tôi chỉ sử dụng ở một chỗ thì đây là một giải pháp tốt. –

+0

Không biết ngon, cảm ơn cho tip! –

1

Đây là một cập nhật cho câu trả lời ban đầu của tôi và tôi sẽ thừa nhận đó như là một kết quả của sự badgering van lơn của @Tyrsius: D từ chối từ bỏ thực tế là tôi không thể truy cập vào các thẻ được tạo trong các thẻ <script> trong trang MVC 5 cshtml của tôi từ thư viện .js của tôi trong các tệp riêng biệt, tôi phát hiện ra rằng nếu tôi đặt các thẻ script bên trong @ phần script stateme nt khối mà các vars tạo ra ở đó đã làm cho phạm vi toàn cầu và đã có sẵn cho các tiện ích plugin của tôi. Tôi đã không sử dụng nó trong bất kỳ ứng dụng phức tạp hơn của tôi, nhưng đã sử dụng nó trong một protoType của một ứng dụng khác và câu trả lời là dưới đây. Bây giờ @ Html.Raw (...) hoạt động và tôi đã có thể sắp xếp một đối tượng mà tôi có thể sử dụng ngay lập tức.

Đây là điều mà tôi sẽ sử dụng từ giờ trở đi ... nhờ một lần nữa cho treo ở đó với tôi @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") 
    } 

Các mã sau đây được trong một .js riêng nộp

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

Đây là một điều "thú vị" mà tôi chưa từng gặp trước đây, cảm ơn bạn đã bao gồm nó =) – Tyrsius

+1

Cảm ơn bạn đã ... làm tôi làm việc để tìm một giải pháp tốt hơn nhiều ... hãy chú ý đến sự tin tưởng của tôi về lol ... – Clarence

Các vấn đề liên quan