JavaScriptSerializer für virtuelle Eigenschaften nicht wirksam?

Ich habe ein Json (myObj) -Aktionsergebnis zurückgegeben. Das myObj ist vom Typ Badge

Die einzigen zwei Objekte von Badge, die eine Schleife von einem Serialisierer verursachen könnten, sind:

public class Badge { public Badge() { } public Badge(String Name, String Description) { this.Name = Name; this.Description = Description; } [ScriptIgnore] public virtual BadgeType BadgeType { get; set; } [ScriptIgnore] public virtual ICollection Users { get; set; } public int ID { get; set; } public string Name { get; set; } public string Description { get; set; } public string PrerequisiteCriteriaRef { get; set; } //PrerequisiteID public static Badge CreateForSeeder(BaseDBContext db, String Name, String Description, int TypeID) { Badge b = new Badge(); b.Name = Name; b.Description = Description; b.BadgeType = db.BadgeTypes.Where(x => x.TypeID == TypeID).FirstOrDefault(); return b; } } 

Wem habe ich das Attribut gegeben, aber es hilft überhaupt nicht …?

Der JavaScriptSerializer (der bei der return Json ) return Json definitiv das Attribut [ScriptIgnore] .

Hier ist ein Beweis:

Modell:

 public class User { public Badge Badge { get; set; } } public class Badge { [ScriptIgnore] public virtual ICollection Users { get; set; } public int ID { get; set; } public string Name { get; set; } } 

Regler:

 public class HomeController : Controller { public ActionResult Index() { var badge = new Badge { ID = 1, Name = "badge" }; var user = new User { Badge = badge }; badge.Users = new[] { user }.ToList(); return Json(badge, JsonRequestBehavior.AllowGet); } } 

Wenn Sie das Attribut [ScriptIgnore] aus der Users-Eigenschaft entfernen, wird ein [ScriptIgnore] .

Ich denke also, dass dein Problem woanders liegt.

Ich persönlich würde jedoch empfehlen, dass Sie Ansichtsmodelle anstelle dieser Attribute [ScriptIgnore] .

Sie definieren also einfach ein Ansichtsmodell, das nur die Eigenschaften enthält, die Sie für die angegebene Ansicht benötigen:

 public class BadgeViewModel { public int ID { get; set; } public string Name { get; set; } } 

In Ihrer Controller-Aktion ordnen Sie dann das Domänenmodell und das Ansichtsmodell zu und übergeben das Ansichtsmodell an die Ansicht:

 public class HomeController : Controller { public ActionResult Index() { Badge badge = ... BasgeViewModel vm = new BasgeViewModel { Id = badge.Id, Name = badge.Name }; return Json(vm, JsonRequestBehavior.AllowGet); } } 

Wenn Sie es satt haben, Mapping-Code in Ihre Controller zu schreiben, gehen Sie einfach zu Ihrer NuGet-Paketkonsole und geben den folgenden Befehl ein:

 Install-Package AutoMapper 

Um die exzellente AutoMapper- Bibliothek voll ausnutzen zu können .

Sie sollten den ApplyToOverrides Parameter von ScriptIgnore auf true :

 [ScriptIgnore(ApplyToOverrides = true)] 

Das Problem hierbei ist, dass Ihre virtual Parameter in einer von Dynamic erstellten class überschrieben werden. In diesem Fall werden die Attribute [ScriptIgnore] ebenfalls überschrieben.

Daher sollten Sie [ScriptIgnore(ApplyToOverrides = true)] , um das Attribut [ScriptIgnore] in abgeleiteten classn gültig zu halten.