我定义了这样的模型
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`。
为什么我做错了?因为我尝试了其他模型并且工作得很好
答案 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
会创建您的实体,以支持延迟加载和更改跟踪。这不是你的问题。问题可能在于循环关联。