Es ist nicht sehr offensichtlich, aber die Json
Methode in-built tut nur die Serialisierung nachdem die Methode JTask
die Ausführung beendet hat. Zu diesem Zeitpunkt wurde der Kontext natürlich entfernt, was zu dem ursprünglichen Fehler führt, den Sie beschreiben.
Wenn Sie eine ICollection<TodoItem>
Eigenschaft in Ihrer Todo
Klasse, jeder von denen wird eine ToDo
Eigenschaft, die eine Referenz auf den übergeordneten ist. Und jede dieser ToDo
Eigenschaften wird auch ICollection<TodoItem>
Kinder haben, die eine Referenz zurück zum Elternteil hat, und so weiter und so fort. Dies kann möglicherweise für unendlich fortlaufen, und wenn der Serializer versucht, das Objekt zu serialisieren, gibt es einen kreisförmigen Referenzfehler auf.
Eine Möglichkeit, beide Probleme gleichzeitig zu lösen, ist die Verwendung von Viewmodels. Ein Viewmodel ist eine Zwischenklasse, die nur eine Teilmenge der Eigenschaften einer Modellklasse enthält. Der typische Fluss ist für die Modellklasse zuerst auf ein Ansichtsmodell konvertierte zu bekommen, dann wäre es das Ansichtsmodell sein, das als Json serialisiert wird:
var viewModels = new List<TodoViewModel>();
using (TestDb db = new TestDb())
{
var todoModels = db.ToDos.Where(todo => todo.UserId == id).ToList();
foreach (var model in todoModels)
{
var todoViewModel = new TodoViewModel
{
// Populate viewmodel properties here
Text = model.Text
};
viewModels.Add(todoViewModel);
}
}
return Json(viewModels, JsonRequestBehavior.AllowGet);
ich einen Blog-Post über die Vorteile der Verwendung von Viewmodels schrieb. Sie können es hier auschecken, wenn Sie interessiert sind: Why Use ViewModels
Sie benötigen die 'ToList' am Ende, weil offensichtlich die Abfrage nicht ausgeführt wird, bis es * ausgewertet *. Der Grund, warum Sie einen Zirkelverweis erhalten, liegt vermutlich daran, dass Sie ein Modell mit einer Navigationseigenschaft für ein anderes Modell mit einer Rückseite haben. In diesem Fall müssen Sie MVC oder WebApi JSON Serialiser einrichten, um Referenzschleifen zu ignorieren. –
Wie machen Sie JSON-Serialisierung? Richten Sie es in der Global.asax oder so etwas ein? –
Verwenden Sie den Javascriptserializer oder JSON.Net? –