2011-05-16 61 views
0

,大家好,我就吃这个问题...JSON + LazyLoad

我的User类具有类似下面的属性用户类型的用户类型:

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; } 
} 

我不能返回一个JSON,像这...

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

我得到一个错误:

A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'.

我得到这个错误的原因是延迟加载(至少这是我的理解),以及不良的解决这个问题,我所做的:

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); 
    } 

我不认为这是一个好的解决方案在这种情况下,我只需要“Id”和“Name”属性,但是如果我需要所有属性呢?我需要一个一个复制吗? 有人可以告诉我,如果有更好的解决方案?

感谢,

蒂亚戈

回答

3

Ayende写了一大series of blog posts这个问题。

但是要总结一下:使用视图模型 =>顺便说一下,这就是我正在回答的关于ASP.NET MVC的StackOverflow的一半以上问题的解决方案。

+0

好吧,我可以使用一个视图模型,但然后我会有2个类似的类。这是一个非常好的选择吗? Tks分享你的知识。 – Thiago 2011-05-16 19:05:10

+0

@Thiago Guttierre,你不会有他们之间的循环参考。所以,是的,它们会相似(这是[AutoMapper](http://automapper.codeplex.com/)派上用场),并被认为是使用ASP.NET MVC的最佳实践。 – 2011-05-16 19:07:41