JSON + LazyLoad

Chicos, tengo un problema con esto ...

Mi clase de usuario tiene una propiedad UserType userType como a continuación:

    public class User
{
    public virtual int  Id { get; set; }
    public virtual string User { get; set; }
    public virtual string Name { get; set; }
    public virtual UserType userType { get; set; }
}

No puedo devolver un JSON, como este ...

[HttpGet]
    public JsonResult JSONUsers(string q)
    {
        IEnumerable<User> model = dataServ.Users.GetUsers( q );
        return this.Json( new { Result = model }, JsonRequestBehavior.AllowGet );
    }

Obtengo un error:

Se detectó una referencia circular al serializar un objeto de tipo 'System.Reflection.RuntimeModule'.

La razón por la que recibo este error es la carga diferida (al menos eso es lo que entendí), y para resolverlo mal, lo hice:

public JsonResult JSON(string q)
    {
        List<User> model = new List<User>();
        IEnumerable<User> users= dataServ.Users.Getusers( q );

        foreach (var item in users)
        {
            User user = new User
            {
                Id = item.Id,
                Name = item.Name
            };
            model.Add( user );
        };

        return this.Json( new { Result = model }, JsonRequestBehavior.AllowGet );
    }

No creo que esta sea una buena solución. En este caso, solo necesito las propiedades "Id" y "Name", pero ¿y si necesito todas las propiedades? ¿Tendré que copiar uno por uno? ¿Alguien puede decirme si hay una mejor solución?

Gracias,

Thiago

preguntado el 16 de mayo de 11 a las 18:05

1 Respuestas

Ayende escribió un gran serie de publicaciones de blog sobre este problema.

Pero para resumir: USAR MODELOS DE VISTA => y, por cierto, esa es la solución a más de la mitad de las preguntas en StackOverflow sobre ASP.NET MVC que estoy respondiendo.

contestado el 16 de mayo de 11 a las 22:05

Ok, puedo usar un modelo de vista, pero luego tendré 2 clases similares. ¿Es esta una buena opción? Tks por compartir tu conocimiento. - Thiago

@Thiago Guttierre, no tendrás la referencia circular entre ellos. Entonces, sí, serán similares (ahí es donde AutoMapper es útil) y se consideran las mejores prácticas cuando se trabaja con ASP.NET MVC. - Darin Dimitrov

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.