2011-12-14 2 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/questions/3365551/asp-net-mvc-how-to-convert-view-model-in-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

Я использую этот помощник, так как 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 (..) теперь, как упоминалось в ссылке Хеманта. (Он сам использует JavaScriptSerializer).

Источником вашей проблемы является «@», который HTML кодирует JSON. Вы можете использовать @ Html.Raw (..), чтобы избежать такого поведения.

+: посмотрите на Json.NET http://json.codeplex.com/

Json.NET обновление

Я обновил помощника некоторое время назад с Json.NET (намного лучше).

Кажется, что некоторые пользователи продолжают читать, повышать и использовать старый код. Я бы хотел, чтобы они использовали лучший способ, с новой версией ниже, или используя 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

Я обычно настраивал NGon (https://github.com/brooklynDev/NGon) для такого рода но если я просто использую в одном месте, это хорошее решение. –

+0

Не знал ngon, спасибо за отзыв! –

1

Это обновление для моего первоначального ответа, и я признаю, что в результате настойчивой травли of @Tyrsius: D, который отказался отказаться от факта, что я не смог получить доступ к vars, созданным в тегах <script> на моей странице MVC 5 cshtml из моих .js-библиотек в отдельных файлах, я обнаружил, что если я поместил теги сценария внутри @ скрипты раздела stateme 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)); 
}); 
+0

Это интересный «gotcha», с которым я не сталкивался раньше, спасибо за то, что вы его включили =) – Tyrsius

+1

Спасибо за подталкивание ... это заставило меня сделать работу найти гораздо лучшее решение ... обратите внимание на небольшое ручное доверие, которое я дал u lol ... – Clarence

Смежные вопросы