2012-05-21 32 views
7

Ich hatte kürzlich ein nerviges Problem. Ich werde mein Datamodell hier vereinfachen, aber das Prinzip ist dasselbe. Ich habe eine Klasse "Benutzer". In dieser Klasse habe ich eine Eigenschaft, die eine Liste von Objekten ist, die der Benutzer besitzt. Ich habe auch diese Klasse "Objekt". Da jedes "Objekt" einen Eigentümer hat, hat es eine Eigenschaft vom Typ "Benutzer", die mit seinem Besitzer verknüpft. Nun, was ich versuche, im Grunde zu tun ist, dieseC# Rekursionsbegrenzung bei der Rückgabe von JSON

return Json(myUser,JsonRequestBehavior.AllowGet); 

Wenn ich die Seite zu laden, dauert es wie 30 Sekunden und dann bekomme ich die Fehlermeldung „RecursionLimit überschritten“.

Ich denke, das liegt daran, dass die Objekte miteinander verknüpft sind. Nun meine Frage ist, wie kann ich "Json" sagen, dass es nicht tiefer als 1 Ebene von Objekten gehen sollte, um dies zu vermeiden?

Antwort

7

myUser ist wahrscheinlich ein Typ, der von EntityFramework generiert wird.

Wenn Sie Json zurückgeben, bereitet das Framework jede Eigenschaft vor, indem es den SQL-Befehl abfeuert, um alle Daten zu laden.

Stattdessen sollten Sie eine ViewModel-Klasse mit konkreten Eigenschaften vorbereiten, die nicht mit EntityFramework verknüpft sind, und dieses Objekt so weit vorbereiten, wie Sie es möchten.

+1

Vielen Dank! Das ist eine Lösung, die für mich funktioniert :) –

+2

Was ich tat, war, linq auf meinem "nestled" Objekt zu verwenden und wählte ein neues anonymes Objekt aus, das nur die Daten enthielt, die ich brauchte. –

3

können Sie Rekursionstiefe durch web.config konfigurieren

http://msdn.microsoft.com/en-us/library/bb763183.aspx

aber Sie wollen wahrscheinlich nur Ihr Modell zu sortieren, nicht Rekursion in erster Linie zu haben. Überlegen Sie, wie viele Daten in Ihrer aktuellen Situation benötigt werden, und geben Sie genau das zurück.

6

Es kann passieren, wenn Ihr Objekt einige Eigenschaften von sich selbst hat. beispielsweise.

public object Employee() 
{ 
    string ID {get; set;} 
    string Name {get; set;} 
    int Age {get; set;} 
    Employee Boss{get; set;} //<-- here 
} 

var employee = new Employee(); 
return Json(employee,JsonRequestBehavior.AllowGet); //The Boss property will cause "RecursionLimit exceeded". 

Um das zu vermeiden. Sie können so etwas tun:

var employee = new Employee(); 
var prepareForJson = new { 
    ID = employee.ID, 
    Name = employee.Name, 
    Age = employee.Age, 
    Boss = employee.Boss.ID 
}; 
return Json(prepareForJson , JsonRequestBehavior.AllowGet); 
+0

+1 danke für die Hilfe –

Verwandte Themen