2012-05-21 20 views
7

Me encontré con un problema molesto recientemente. Voy a simplificar mi modelo de datos aquí, pero el principio es el mismo. Tengo una clase "Usuario". En esa clase tengo una propiedad que es una lista de objetos que posee el usuario. También tengo este "objeto" de clase. Como cada "objeto" tiene un propietario, tiene una propiedad de tipo "Usuario", que se vincula con su propietario. Ahora, lo que estoy tratando de hacer es, básicamente, esteC# límite de recursividad al devolver JSON

return Json(myUser,JsonRequestBehavior.AllowGet); 

Cuando me carga la página, se tarda como 30 segundos y luego me sale el error "RecursionLimit excedido".

Supongo que esto se debe a que los objetos se vinculan entre sí. Ahora mi pregunta es, ¿cómo puedo decirle a "Json" que no debe ir más allá de 1 nivel de objetos para evitar esto?

Respuesta

7

myUser es probablemente un tipo generado por EntityFramework.

Cuando devuelve Json, el marco va a preparar cada propiedad, en esencia, activando el comando SQL para cargar todos los datos de forma perezosa.

En su lugar, debe preparar una clase ViewModel con propiedades concretas no asociadas a EntityFramework y preparar ese objeto tan profundo como desee.

+1

¡Gracias! Esa es una solución que funciona para mí :) –

+2

Lo que hice fue básicamente utilizar linq en mi objeto "anidado" y seleccioné un nuevo objeto anónimo que contenía solo los datos que necesitaba. –

3

Puede configurar nivel de recursividad a través web.config

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

pero es probable que sólo quieren resolver su modelo no tener la recursividad en el primer lugar. Piense cuántos datos se necesitan en su situación actual y devuelva eso.

6

Puede suceder cuando su objeto tiene algunas propiedades de sí mismo. por ejemplo.

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

Para evitar eso. usted puede hacer algo como eso:

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 gracias por ayudarme –