3

我正在使用传统和 Web API 控制器构建 MVC 4 应用程序。由于我还使用 EF5 和代码优先,因此我具有导致循环引用的导航属性。我JsonIgnore在这些导航属性上使用属性以避免在序列化为 Json 时遇到循环引用循环。

这种方法完美地适用于我的 Web API 控制器,但是,当Html.Raw(Json.Encode(Model))在传统控制器的 Razor 模板中使用时,由于循环引用,我得到一个异常:

序列化对象时检测到循环引用

此异常发生在System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal. 我是否正确地解释了这一点,因为它Json.Encode似乎使用了不同的 Json 编码器(不是 json.net)?如何从 Razor 模板中使用 Web API 中使用的已配置 Json.Net 格式化程序?

我想出了一个解决方法,我使用以下类

namespace MyMVCProject.Globals
{
    public class Helper
    {
        public static string ToJson(object obj)
        {
            return JsonConvert.SerializeObject(obj, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings);
        }
    }
}

所以我可以在模板中使用它:@Html.Raw(MyMVCProject.Globals.Helper.ToJson(Model))

对于我期望的默认行为来说,这仍然感觉很尴尬Json.Encode

4

1 回答 1

0

没错,当您调用时,Json.Encode您使用的是 class 中的方法System.Web.Helpers.Json

如果您想使用不同的 Json 编码器,只需使用它即可。您可以像以前那样使用帮助类来包装对 的调用JsonConvert并对其进行配置(包括 deisred 格式化程序)。

您可以包含包装类的命名空间,这样就可以避免编写命名空间。(您可以在 web.config 中从视图中执行此操作,您经常使用它)。

你不能做的是改变Json.Encode因为是一个静态类成员的行为,并且它的命名空间总是包含在剃刀视图中(因为你需要来自同一个命名空间的更多东西)。

您还可以将其实现为要序列化的对象的扩展方法。只有语法改变。

请记住,您还可以使用[DataContract]属性自定义序列化,如本页所示

您还可以使用附加到类定义中感兴趣的属性的其他 Json.Net 属性来自定义每个成员的序列化方式。

于 2013-04-04T14:27:04.860 回答