在ASP.NET MVC中全局应用JSON Serializer设置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在ASP.NET MVC中全局应用JSON Serializer设置相关的知识,希望对你有一定的参考价值。
当我的Entity Framework Navigation
尝试序列化我的Kendo Grid
中的集合时,View Model
属性导致“循环对象引用”异常。我们正在使用Newtonsoft.JSON
,所以我想(全局)在我的Application_Start()
中将“ReferenceLoopHandling”设置为“Ignore”。
奇怪的是,ASP.NET似乎并不尊重设置...所以我仍然得到例外。
...有任何想法吗?
版本:
- Microsoft.AspNet.Mvc(5.2.3.0)
- Microsoft.AspNet.WebApi(5.2.3)
- Newtonsoft.Json(10.0.3)
示例APPLICATION_START: 转移到顶部或底部的调用不会改变结果......
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
LoadSiteMap();
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
}
样品剃须标记: 注意“BindTo”选项......
@(html.Kendo().Grid<RTUDeviceControlRoomAlarm>()
.Columns(columns =>
{
columns.Bound(x => x.Id)
.Visible(false);
columns.Bound(x => x.RTUDeviceId)
.Visible(false);
columns.Bound(x => x.Register)
.Title("Register")
.Width(50);
columns.Bound(x => x.Description)
.Title("Description")
.Width(100);
columns.Bound(x => x.LowLowLimitOFF)
.Title("LL Limit/OFF")
.Width(50);
columns.Bound(x => x.LowLowLimitON)
.Title("LL Limit/ON")
.Width(50);
columns.Bound(x => x.HiLimit)
.Title("Hi Limit")
.Width(50);
columns.Bound(x => x.HiHiLimit)
.Title("HH Limit")
.Width(50);
columns.Command(command => { command.Edit(); command.Destroy(); }).Width(70);
})
.Name("gridControlRoomAlarms")
.ToolBar(toolbar => toolbar.Create())
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Sortable()
.Scrollable()
.BindTo(Model.RTUDeviceControlRoomAlarms)
.DataSource(dataSource => dataSource.Ajax()
.PageSize(50)
.Model(model => { model.Id(m => m.Id); })
.Create(update => update.Action("Create", "ControlRoomAlarm", new { Area = "Documents" }))
.Update(update => update.Action("Update", "ControlRoomAlarm", new { Area = "Documents" }))
.Destroy(update => update.Action("Destroy", "ControlRoomAlarm", new { Area = "Documents" }))
)
.HtmlAttributes(new { @class = "", @style = "height: 400px;" }))
更新: 也试过......
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
答案
尝试在Application_Start()
中添加此配置作为最后一行:
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
请参阅https://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm并注意代码中可能存在的副作用
以上是关于在ASP.NET MVC中全局应用JSON Serializer设置的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core 3.1 MVC/WebApi JSON 全局配置
在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON
从 ASP.net Core 2 MVC 应用程序中的 appSettings.json 存储/检索 ConnectionString