2012-05-21 50 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感謝您的幫助 –