2012-05-21 57 views
7

最近我遇到了一个烦人的问题。我要在这里简化我的数据模型,但原理是一样的。我有一个“用户”类。在那个类中,我有一个属性是用户拥有的对象列表。我也有这个类“对象”。因为每个“对象”都有一个所有者,所以它有一个类型为“用户”的属性,它链接到它的所有者。现在,我想要做的是基本上这返回JSON时C#递归限制

return Json(myUser,JsonRequestBehavior.AllowGet); 

当我加载网页,它需要像30秒,然后我得到的错误“RecursionLimit超标”。

我想这是因为对象是相互链接的。现在我的问题是,我怎么能告诉“Json”它不应该深入一层对象来避免这种情况?

回答

7

myUser可能是由EntityFramework生成的一种类型。

当您返回Json时,框架将准备每个属性,实质上是发出SQL命令来延迟加载所有数据。

相反,你应该准备一个ViewModel类,它具有不附加到EntityFramework的具体属性,并且准备好你想要的对象。

+1

谢谢!这是一个解决方案,适用于我:) –

+2

我所做的是基本上对我的“依赖”对象使用linq,并选择一个新的匿名对象,只包含我需要的数据。 –

6

当您的对象具有其自身的某些属性时可能会发生这种情况。例如。

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". 

为了避免这种情况。你可以这样做:

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感谢您的帮助 –