无法序列化对象

时间:2011-10-19 16:55:12

标签: c# jquery asp.net asp.net-mvc-3

我定义了这样的模型

public class Planilla
{
    [Key]
    public int IDPlanilla { get; set; }

    [Required(ErrorMessage = "*")]
    [Display(Name = "Dirección de Negocio")]
    public int IDDireccionDeNegocio { get; set; }

    [Required (ErrorMessage = "*")]
    public string Nombre { get; set; }
    [Display(Name = "Descripción")]
    public string Descripcion { get; set; }

    public bool Activo { get; set; }

    [ScriptIgnore]
    public virtual DireccionDeNegocio DireccionDeNegocio { get; set; }
}

我的控制器中有一个方法可以返回此模型的第一个元素

    [HttpPost]
    public ActionResult GetElements(string IDCampana)
    {
        Planilla query = db.Planillas.First();
        return Json(query);                 
    }

我的问题是,当我从客户端调用此方法时会抛出一个错误,表示

  检测到

循环引用尝试序列化   System.Data.Entity.DynamicProxies.Planilla_7F7D4D6D9AD7AEDCC59865F32D5D02B4023989FC7178D7698895D2CA59F26FEE Debugging my code I realized that the object returned by the execution of the method首先it's a {System.Data.Entity.DynamicProxies.Planilla_7F7D4D6D9AD7AEDCC59865F32D5D02B4023989FC7178D7698895D2CA59F26FEE} instead a Model of my namespace like Example.Models.DireccionDeNegocio`。

为什么我做错了?因为我尝试了其他模型并且工作得很好

2 个答案:

答案 0 :(得分:3)

使用视图模型,这是我能给你的唯一建议。切勿将域模型传递给您的视图。就这么简单。如果您尊重ASP.NET MVC应用程序中的这个简单规则和基本规则,您将永远不会遇到问题。例如,如果您只需要视图中的ID和描述:

[HttpPost]
public ActionResult GetElements(string IDCampana)
{
    Planilla query = db.Planillas.First();
    return Json(new 
    { 
        Id = query.IDPlanilla, 
        Description = query.Description 
    });
}

请注意,在这种情况下,匿名对象充当视图模型。但是如果你真的想要做正确的事情,你会写出你的视图模型:

public class PlanillaViewModel
{
    public int Id { get; set; }
    public string Description { get; set; }
}

然后:

[HttpPost]
public ActionResult GetElements(string IDCampana)
{
    Planilla query = db.Planillas.First();
    return Json(new PlanillaViewModel 
    { 
        Id = query.IDPlanilla, 
        Description = query.Description 
    });
}

顺便说一下,艾恩德写了nice series of blog posts关于此事。

答案 1 :(得分:1)

System.Data.Entity.DynamicProxies.*是实体框架代理命名空间。您的DbContext会创建您的实体,以支持延迟加载和更改跟踪。这不是你的问题。问题可能在于循环关联。