2016-05-17 10 views
0

Ich weiß, dass sind Tonnen von Fragen zu diesem Thema in ganz SO aber keiner von ihnen löste mein Problem.Circular Reference beim Serialisieren EF-Modell zu JSON

Ich verwende MVC 5 mit Entity Framework 6 und Newtonsoft.Json.

Ich habe das übliche Szenario für diese Ausnahme:

Service => Staff => Service 

Wenn ich versuche, ein service Objekt meiner Ansicht zu serialisiert, wie folgt aus:

var arr = @Html.Raw(@JsonConvert.SerializeObject(Model.Services)); 

Ich erhalte die „circular reference was detected while serializing an object of type...“ Ausnahme.

Alle Antworten, die ich hier sagen, dass es wasy zu lösen ist, sollte ich nur

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings 
      .PreserveReferencesHandling = PreserveReferencesHandling.All; 

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings 
     .ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 

in meiner Global.asax Datei hinzufügen.

Nun, ich tat es, und es funktioniert einfach nicht. Ich lese eine Reihe von Artikeln auf MSDN und sie alle sagen das Gleiche. Ich weiß nicht warum, aber es funktioniert einfach nicht für mich.

Der einzige Weg, ich konnte es funktioniert, war die ganze Serialisierungskontext in meinem Controller zu erstellen:

var settings = new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.All, 
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize 
}; 


var serializer = JsonSerializer.Create(settings); 
var msmStream = new MemoryStream(); 
var txtWriter = new StreamWriter(msmStream); 
var writer = new JsonTextWriter(txtWriter) { Formatting = Formatting.Indented }; 
serializer.Serialize(writer, services); 

var json = Encoding.ASCII.GetString(msmStream.GetBuffer()); 

Dies ist jedoch eine schreckliche schreckliche Lösung ist, besonders, wenn ich von der Unterkunft bin Serialisierung meines Modell in der Ansicht in Echtzeit anzeigen. Es vereitelt auch den ganzen Zweck einer "globalen Konfiguration".

Hat jemand dieses Problem konfrontiert?

+0

Können Sie Ihren JSON zeigen? – Kamo

Antwort

1

Sie müssen die DefaultSettings in neue ändern.

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.All, 
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize 
}; 

Quelle

0

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings wirkt sich nur auf Web-API-Aufrufe. Da Sie JsonConvert.SerializeObject direkt aufrufen, müssen Sie die Einstellungen entweder direkt an sie übergeben (siehe unten) oder die globalen Standardeinstellungen wie in @ vendettamits Antwort gezeigt einrichten.

var arr = @Html.Raw(@JsonConvert.SerializeObject(Model.Services, new JsonSerializerSettings 
        { PreserveReferencesHandling = PreserveReferencesHandling.All })); 
+0

Danke für die Info. Sie hätten dies in der Dokumentation sehr deutlich machen sollen, aber sie sagen nur "Oh, fügt einfach das und das hinzu und es wird funktionieren". Ich habe die Antwort von Vendettami akzeptiert, weil sie die globale Konfigurationsidee, die ich besser brauche, bewahrt. – victor

+0

Nun, sie gehen wahrscheinlich davon aus, dass Sie, wenn Sie die Web-API verwenden, eine Controller-Methode erstellen, die den JSON zurückgibt und diesen dann über AJAX aus Ihrer Sicht aufruft. Es ist ungewöhnlich, Ihr Modell manuell in der Ansicht selbst zu serialisieren. –

+0

Ich benutze mvc 5with web api, aber ich habe noch nicht auf der api begonnen. Ich habe eine stark typisierte Ansicht, in der ich mit Rasiermesser arbeite, aber abhängig von der Benutzeraktion, musste ich möglicherweise Teile des Modells serialisieren. Es ist wirklich ungewöhnlich – victor

1

Die Standard-Serializer-Einstellungen müssen wie folgt geändert werden. In Global.aspx,

protected void Application_Start() 
{ 
    var jsonMediaTypeFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
    jsonMediaTypeFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 
    jsonMediaTypeFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
} 
+0

Bitte erklären Sie, warum die Einstellungen geändert werden müssen – cnorthfield

+0

Danke. Das funktioniert für mich.Aber ich musste die Zeile entfernen, in der Sie PreserveReferencesHandling festgelegt haben, weil das serialisierte JSON vom Referenzhandling-Objekt umschlossen wurde. –

Verwandte Themen