Простите, если об этом уже спрашивали; Я не смог найти ничего похожего после нескольких поисков:
Я пытаюсь написать ActionFilter в MVC, который будет «перехватывать» IQueryable и аннулировать все родительско-дочерние отношения во время выполнения. Я делаю это потому, что Linq не сериализует объекты должным образом, если они имеют отношения родитель-потомок (он выдает ошибку циклической ссылки, потому что родитель ссылается на дочерний элемент, который ссылается на родителя и т. Д.), И мне нужен объект сериализовано в Json для вызова Ajax. Я попытался пометить дочерние отношения в файле DBML со статусом внутренней конфиденциальности, и хотя это устраняет проблему сериализации, оно также скрывает дочерние элементы от движка представления при визуализации страницы, вызывая появление другой ошибки. Итак, исправляя одну проблему, я вызываю другую.
Единственное, что устраняет обе проблемы, - это вручную установить нулевые значения дочерних элементов непосредственно перед возвратом сериализации, но я стараюсь избегать этого, потому что это громоздко, не может использоваться повторно и т. Д. Я бы лучше использовал ActionFilter проверять сериализуемый IQueryable и аннулировать любые члены с типом EntitySet (как представлены внешние ключи / ассоциации). Тем не менее, у меня нет большого опыта работы с Reflection и я не могу найти примеров, иллюстрирующих, как сделать что-то подобное Так ... это возможно с Reflection? Есть ли лучший способ сделать то же самое? Я выложу соответствующий код завтра, когда вернусь за рабочим компьютером.
Спасибо
Daniel
Как и обещал, код:
[GridAction]
public ActionResult _GetGrid()
{
IQueryable<Form> result = formRepository.GetAll();
foreach (Form f in result)
{
f.LineItems = null;
f.Notes = null;
}
return View(new GridModel<Form> { Data = result });
}
Добавлена еще одна проблема: я использую новые Telerik MVC Extensions, поэтому я на самом деле не сериализую Json - я просто возвращаю IQueryable в IGridModel, а фильтр действий [GridAction] выполняет отдых.