2012-05-21 43 views
7

Gần đây tôi gặp phải sự cố gây phiền nhiễu. Tôi sẽ đơn giản hóa datamodel của tôi ở đây, nhưng nguyên tắc chỉ là như nhau. Tôi có một lớp "Người dùng". Trong lớp đó tôi có một thuộc tính là một danh sách các đối tượng mà người dùng sở hữu. Tôi cũng có lớp "đối tượng" này. Bởi vì mỗi "đối tượng" đều có một chủ sở hữu, nó có một thuộc tính kiểu "Người dùng", liên kết với chủ sở hữu của nó. Bây giờ, những gì tôi đang cố gắng thực hiện về cơ bản làGiới hạn đệ quy C# khi trả về JSON

return Json(myUser,JsonRequestBehavior.AllowGet); 

Khi tôi tải trang này, phải mất 30 giây và sau đó tôi nhận được lỗi "Quá trình đệ quyLượt quá".

Tôi đoán điều này là do các đối tượng đang liên kết với nhau. Bây giờ câu hỏi của tôi là, làm thế nào tôi có thể nói "Json" rằng nó không nên đi sâu hơn sau đó 1 mức độ của các đối tượng để tránh điều này?

Trả lời

7

myUser có lẽ là loại được tạo bởi EntityFramework.

Khi bạn quay trở lại Json, khuôn khổ sẽ chuẩn bị từng thuộc tính trong bản chất kích hoạt lệnh SQL để tải xuống tất cả dữ liệu. Thay vào đó, bạn nên chuẩn bị một lớp ViewModel với các thuộc tính cụ thể không gắn với EntityFramework và chuẩn bị đối tượng đó sâu như bạn muốn nó đi.

+1

Cảm ơn bạn! Đó là một giải pháp phù hợp với tôi :) –

+2

Điều tôi đã làm cơ bản là sử dụng LINQ trên đối tượng "nép mình" của tôi và đã chọn một đối tượng ẩn danh mới chỉ chứa dữ liệu tôi cần. –

3

Bạn có thể cấu hình độ sâu đệ quy qua web.config

http://msdn.microsoft.com/en-us/library/bb763183.aspx

nhưng có thể bạn chỉ muốn sắp xếp ra mô hình của bạn không có đệ quy ở nơi đầu tiên. Hãy suy nghĩ cần bao nhiêu dữ liệu trong tình huống hiện tại của bạn và chỉ trả lại dữ liệu đó.

6

Điều này có thể xảy ra khi đối tượng của bạn có một số thuộc tính của chính nó. ví dụ.

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

Để tránh điều đó. bạn có thể làm điều gì đó tương tự:

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 cảm ơn vì đã giúp tôi –

Các vấn đề liên quan