Это не очень очевидно, но встроенный в Json
метод делает только сериализации после завершения метода JTask
. К тому времени, конечно, контекст был удален, что привело к исходной ошибке, которую вы описываете.
Если у вас есть ICollection<TodoItem>
свойства внутри вашего Todo
класса, каждый из которых будет иметь ToDo
свойства, которое является ссылкой обратно к родителю. И каждый из этих ToDo
объектов также будет иметь детей ICollection<TodoItem>
, которые снова возвращаются к родителям и т. Д. И т. Д. Это может потенциально зацикливаться на бесконечность, и когда сериализатор пытается сериализовать объект, он отказывается от круговой контрольной ошибки.
Одним из способов решения обеих этих проблем в одно и то же время является использование режимов просмотра. Viewmodel - это промежуточный класс, который содержит только подмножество свойств, которые имеет класс модели. Типичный поток для класса модели, чтобы получить преобразованный в ViewModel первым, то это будет ViewModel, который получает сериализовать JSON:
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);
Я написал сообщение в блоге о преимуществах использования ViewModels. Вы можете проверить это здесь, если вам интересно: Why Use ViewModels
Вам нужно будет 'ToList' на конце, потому что очевидно, что запрос не будет выполняться до тех пор, пока он не получит * оцененный *. Тем не менее, причина, по которой вы получаете круговую ссылку, я предполагаю, потому что у вас есть модель, которая имеет свойство навигации для другой модели, у которой есть одна спина. В этом случае вам нужно настроить MVC или WebApi JSON-сериализатор для игнорирования опорных циклов. –
Как вы делаете сериализацию JSON? Вы настраиваете его в Global.asax или что-то в этом роде? –
Вы используете Javascriptserializer или JSON.Net? –