2016-06-05 4 views
0

erkannt Ich habe ein Asp.NET MVC-Projekt, Datenbank zuerst. Ich habe eine Erstellen Aktion in Platz Controller. In der Aktionsmethode bekomme ich meine Daten wie folgt aus:Eine zirkuläre Referenz wurde beim Serialisieren eines Objekts vom Typ 'System.Data.Entity.DynamicProxies'

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

My Place View-Modell sieht wie folgt aus:

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

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

My Place Modell:

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

AspNetUser:

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

Jetzt möchte ich Model.Pl verwenden Aces Proprietes im Javascript-Teil der Seite. Wie kann ich das machen?

Ich habe an folgende versucht:

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

Aber ich habe diesen Fehler:

{"A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies.Place_084A987E8F6FBE574A22E813FE314F2894AF728F244BDD6582AF50929FF1161D'."}

ich die folgenden Links auf SO geprüft haben, aber verwalten nicht zu lösen mein Problem:

+0

Nicht verwandt, aber es müsste 'var model = @ Html.Raw (Json.Encode (Model));' (ohne die Anführungszeichen) sein, wenn Sie das Modell zu einem JavaScript-Objekt serialisieren wollten. –

+0

Sie müssen das Modell für 'Place' anzeigen (es würde eine Eigenschaft enthalten, die ein Objekt ist, das eine Eigenschaft' Place' enthält, die einen Zirkelverweis verursacht) –

+0

Enthält die Klasse 'AspNetUser' eine Eigenschaft für' Place'? –

Antwort

2

Sie PlacesVM View-Modell enthält eine Eigenschaft, die typeof Place ist, was wiederum eine Eigenschaft enthält, die typeof AspNetUser ist, was wiederum eine Eigenschaft enthält, die typeof Collection<Place> ist.

Wenn die Json.Encode() Methode Modell serialisiert, serialisiert es Place die dann AspNetUser serialisiert, die dann jeden Place serialisiert, die den Fehler wirft, denn wenn weiterhin gestattet, würde es jeden AspNetUser und so weiter serialisiert werden und so weiter, bis das System lief aus dem Speicher.

Ändern Sie das Ansichtsmodell so, dass nur die Eigenschaften enthalten sind, die Sie in der Ansicht benötigen - siehe What is ViewModel in MVC?. Beachten Sie, dass ein Ansichtsmodell im Allgemeinen keine Eigenschaften enthalten sollte, bei denen es sich um Datenmodelle handelt, insbesondere wenn Sie Daten in einer Ansicht bearbeiten. Kopieren Sie stattdessen die Eigenschaften von Place in PlaceVM, die Sie bearbeiten müssen, mit Ausnahme von AspNetUser, und wenn Sie einige Eigenschaften von AspNetUser anzeigen müssen, fügen Sie einfach weitere Eigenschaften für dann ein, z. B. public string UserName { get; set; }.

Seitennotiz: Ihr aktuelles Ansichtsmodell enthält keinen standardmäßigen (parameterlosen) Konstruktor, sodass die DefaultModelBinder beim Übergeben eine Ausnahme auslöst.

Verwandte Themen