2

我有 Json.Encode 在本地工作(本地主机)的情况,它是 64 位 iis7 windows 7 框。

如果我部署到 windows 2003 32 位 IIS6,我会得到循环引用错误。显示在“此处的错误”下方是错误开始的行。

@*var model = '@Html.Raw(Json.Encode(Model))';*@ <<<<Error here
var model = '@Html.GetJson(Model)';

作为尝试解决此问题的一部分,我认为服务器上使用的项目 dll 之一可能与本地不同,因此我将任何引用 dll 复制到服务器 bin 目录。这没有帮助。

我确实有一个非常简单的修复程序。我本来希望能够识别问题。我的猜测是,它在服务器上使用的某些 dll 与在本地通过 Json.Encode 返回 json 的方式不同,然后在服务器上使用。

如上图第 2 行所示,我的解决方案是使用 Json.Net 和 mvc 助手

public static MvcHtmlString GetJson(this HtmlHelper htmlHelper, ViewModel vm)
{
    string s = JsonConvert.SerializeObject(vm);
    return new MvcHtmlString(s);
}

有没有人看到这个并解决了?(没有 json.net)

4

1 回答 1

1

假设您使用的是实体框架,那么看看框架开发的实体将会对这个主题有所了解。例如,我有一个名为 Sessions 的表和一个名为 Enrollments 的表,Enrollments 表与 Sessions 表 PK 具有 FK 关系。这导致 Session 对象具有 Enrollments 的集合,而 Enrollment 对象具有注册所针对的 Session 的虚拟实例......这反过来又指向 Enrollments 的集合等......你得到了图片,并且为什么 json 序列化检测到循环引用问题。

解决方案是不在代码中查询 Session 对象的集合,而是查询其中包含所有相同字段的匿名(无类型)对象。这可以防止 Json.Encode() 混淆,因为它不知道实体框架在代码后面/服务器端代码中可以使用的循环引用。

于 2018-05-17T15:39:47.873 回答