gpt4 book ai didi

javascript - 序列化类型为 'System.Data.Entity.DynamicProxies' 的对象时检测到循环引用

转载 作者:行者123 更新时间:2023-12-02 14:33:36 24 4
gpt4 key购买 nike

我有一个Asp.NET MVC项目,首先是数据库。我在 Place Controller 中有一个 Create 操作。在操作方法中,我获取的数据如下:

// GET: /Place/Create
[Authorize]
public ActionResult Create()
{
string userId = User.Identity.GetUserId();
var places = db.Places.Where(p => p.UserId == userId);

var placesVM = new PlacesVM(places);

ViewBag.UserId = new SelectList(db.AspNetUsers, "Id", "UserName");
return View(placesVM);
}

我的地点 View 模型如下所示:

public class PlacesVM
{
public IQueryable<Place> Places { get; set; }
public Place Place { get; set; }

public PlacesVM(IQueryable<Place> places)
{
Places = places;
Place = new Place();
}
}

我的地方模型:

public partial class Place
{
public string Id { get; set; }
public string UserId { get; set; }
//TODO: Validare cordonate
public decimal X { get; set; }
public decimal Y { get; set; }

[Display(Name = "Title")]
[Required]
[StringLength(250, MinimumLength = 5)]
public string Titlu { get; set; }

[Display(Name = "Description")]
[Required]
[StringLength(500, MinimumLength = 10)]
public string Descriere { get; set; }

[Required]
[Range(0, 1)]
public byte Public { get; set; }

public virtual AspNetUser AspNetUser { get; set; }
}

AspNet用户:

public partial class AspNetUser
{
public AspNetUser()
{
this.AspNetUserClaims = new HashSet<AspNetUserClaim>();
this.AspNetUserLogins = new HashSet<AspNetUserLogin>();
this.Places = new HashSet<Place>();
this.UserComments = new HashSet<UserComment>();
this.AspNetRoles = new HashSet<AspNetRole>();
}

public string Id { get; set; }
public string UserName { get; set; }
public string PasswordHash { get; set; }
public string SecurityStamp { get; set; }
public string Discriminator { get; set; }

public virtual ICollection<AspNetUserClaim> AspNetUserClaims { get; set; }
public virtual ICollection<AspNetUserLogin> AspNetUserLogins { get; set; }
public virtual ICollection<Place> Places { get; set; }
public virtual ICollection<UserComment> UserComments { get; set; }
public virtual ICollection<AspNetRole> AspNetRoles { get; set; }
}

现在我想在页面的 javascript 部分使用 Model.Places proprietes。我怎样才能做到这一点?

我尝试过以下操作:

<script>
var model = '@Html.Raw(Json.Encode(Model))';
</script>

但是我收到了这个错误:

{“序列化类型为“System.Data.Entity.DynamicProxies.Place_084A987E8F6FBE574A22E813FE314F2894AF728F244BDD6582AF50929FF1161D”的对象时检测到循环引用。”}

我已经检查了以下链接,但未能解决我的问题:

最佳答案

PlacesVM View 模型包含 typeof Place 的属性其中又包含一个 typeof AspNetUser 的属性其中又包含一个 typeof Collection<Place> 的属性.

Json.Encode()方法序列化你的模型,它序列化 Place然后序列化 AspNetUser然后序列化每个 Place这会引发错误,因为如果允许继续,它将序列化每个 AspNetUser依此类推,直到系统内存耗尽。

更改 View 模型以仅包含 View 中需要的属性 - 请参阅 What is ViewModel in MVC? 。请注意, View 模型通常不应包含属于数据模型的属性,尤其是在 View 中编辑数据时。相反,从 Place 复制属性进入PlaceVM您需要编辑,但 AspNetUser 除外,如果您需要显示 AspNetUser 的一些属性,然后只需包含 then 的其他属性,例如 public string UserName { get; set; } .

旁注:您当前的 View 模型不包含默认(无参数)构造函数,因此 DefaultModelBinder提交时会抛出异常。

关于javascript - 序列化类型为 'System.Data.Entity.DynamicProxies' 的对象时检测到循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37641578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com