Ответ 1
Попробуйте использовать этот метод:
@Html.Raw(Json.Encode(Model.Content))
Я хочу преобразовать объект .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?
Попробуйте использовать этот метод:
@Html.Raw(Json.Encode(Model.Content))
Я использую этот помощник, так как 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));
}
}
}
Это обновление моего первоначального ответа, и я признаю, что в результате настойчивого нарушения @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));
});