Глобальное применение настроек JSON Serializer в ASP.NET MVC - PullRequest
0 голосов
/ 30 августа 2018

Entity Framework Navigation свойства вызывают исключение "Ссылка на круговой объект" , когда мой Kendo Grid пытается сериализовать коллекцию в моем View Model. Мы используем Newtonsoft.JSON, поэтому я хотел (глобально) установить "ReferenceLoopHandling" в "Игнорировать" в моем Application_Start().

Как ни странно, ASP.NET, похоже, не соблюдает настройки ... поэтому я все еще получаю исключение.

... ЛЮБЫЕ ИДЕИ?

ВЕРСИЯ:

  • Microsoft.AspNet.Mvc (5.2.3.0)
  • Microsoft.AspNet.WebApi (5.2.3)
  • Newtonsoft.Json (10.0.3)

SAMPLE 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;" }))

UPDATE:
Также попробовал ...

  • GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

1 Ответ

0 голосов
/ 30 августа 2018

Попробуйте добавить эту конфигурацию в Application_Start() в качестве последней строки:

json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;

См. https://www.newtonsoft.com/json/help/html/PreserveObjectReferences.htm и будьте осторожны с возможным побочным эффектом в вашем коде

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...