在Web API中使用,但在调用Json时不使用.编码在剃刀模板
本文关键字:编码 剃刀 API Web 调用 Json | 更新日期: 2023-09-27 18:02:51
我正在用传统和Web API控制器构建MVC 4应用程序。因为我也使用EF5代码优先,我有导航属性,导致循环引用。我在这些导航属性上使用JsonIgnore
属性,以避免在序列化到Json时遇到循环引用循环。
这种方法对于我的Web API控制器完美地工作,但是,当在传统控制器的Razor模板中使用Html.Raw(Json.Encode(Model))
时,由于循环引用,我得到一个异常:
在序列化对象时检测到循环引用
System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal
出现此异常。我在Json.Encode
似乎使用不同的Json编码器(不是json.net)中正确地解释了这一点吗?如何使用配置的Json。Net格式化器使用在Web API从内部Razor模板?
我想出了一个解决方案,我使用下面的类
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
的默认行为,这仍然感觉很尴尬
你是对的,当你调用Json.Encode
时,你正在使用System.Web.Helpers.Json
类的方法。
如果你想使用不同的Json编码器,就使用它。您可以使用一个helper类来包装对JsonConvert
的调用,并对其进行配置(包括所需的格式化器)。
可以包含包装器类的名称空间,这样就可以避免编写名称空间。(你可以在网上做。如果你经常使用的话,可以从视图中配置。
你不能做的是改变Json.Encode
的行为,因为它是一个静态类成员,它的命名空间总是包含在razor视图中(因为你需要更多来自同一个命名空间的东西)。
您还可以将其实现为要序列化的对象的扩展方法。只有语法改变了。
请记住,您还可以使用[DataContract]
属性自定义序列化,正如您在此页中所看到的。
您还可以使用其他Json自定义每个成员序列化的方式。. Net属性附加到类定义中感兴趣的属性。