Подтвердить что ты не робот

Преобразовать объект .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. В настоящее время я делаю это так:

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?

4b9b3361

Ответ 1

Попробуйте использовать этот метод:

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

Ответ 2

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

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

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

Обновление JSON.Net

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

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

Ответ 3

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