You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6.0序列化Model遇自引用循环错误的解决咨询

解决ASP.NET Core 6.0中JS读取Model时的自引用循环问题

问题本质

你遇到的报错核心原因是误将包含循环引用的框架对象(比如PageContext、ActionDescriptor)传递给了前端,而非你定义的简易Model。即使配置了NewtonsoftJson忽略循环引用,这类框架对象的复杂内部结构仍会触发序列化问题。

具体解决方案

1. 确保仅传递自定义Model到前端

先确认你的自定义Model结构(示例为单个字段):

public class MySimpleModel
{
    public string TargetField { get; set; }
}

在PageModel中初始化并暴露这个业务Model:

public class IndexModel : PageModel
{
    public MySimpleModel MyModel { get; set; }

    public void OnGet()
    {
        MyModel = new MySimpleModel { TargetField = "测试数据" };
    }
}

2. 直接在Razor视图中序列化自定义Model

在Razor页面里,用Html.Raw配合序列化工具,将自定义Model转为JS可识别的JSON:

方式一:使用ASP.NET Core内置Json序列化

<script>
    // 将自定义Model序列化为JS对象
    const myModel = @Html.Raw(Json.Serialize(Model.MyModel));
    // 读取目标字段
    console.log(myModel.TargetField);
</script>

方式二:使用NewtonsoftJson序列化(适配你已配置的场景)

<script>
    const myModel = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(
        Model.MyModel,
        new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }
    ));
    console.log(myModel.TargetField);
</script>

3. 通过AJAX异步获取Model数据(适合动态加载场景)

如果需要异步加载数据,可在PageModel中添加Handler方法:

public IActionResult OnGetFetchModel()
{
    var model = new MySimpleModel { TargetField = "异步加载数据" };
    return Json(model);
}

用jQuery发起AJAX请求:

<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
<script>
    $(function() {
        $.get("/Index?handler=FetchModel", function(data) {
            console.log(data.TargetField);
        });
    });
</script>

4. 检查Program.cs的NewtonsoftJson配置(确保生效)

如果依赖NewtonsoftJson处理序列化,需确保在Program.cs中正确配置Razor Pages的序列化选项:

var builder = WebApplication.CreateBuilder(args);

// 添加Razor Pages服务并配置NewtonsoftJson
builder.Services.AddRazorPages()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    });

var app = builder.Build();

// 其他中间件配置...
app.MapRazorPages();
app.Run();

关键注意事项

  • 绝对不要尝试序列化PageContext、ActionDescriptor这类框架内部对象,它们包含大量循环引用的属性,完全不是你需要的业务数据。
  • 始终只传递自定义业务Model到前端,这类结构简单,不会产生循环引用问题,也能减少不必要的数据传输。

内容的提问来源于stack exchange,提问作者Mark C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:05:22