2

我返回了一个 Json(myObj) 操作结果。myObj 是 Badge 类型

Badge 仅有的两个可能导致序列化程序循环的对象是:

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

我赋予了哪个属性,但它根本没有帮助......?

4

3 回答 3

12

您应该将ApplyToOverrides参数设置ScriptIgnoretrue

[ScriptIgnore(ApplyToOverrides = true)]
于 2015-02-23T15:06:44.980 回答
4

这里的问题是您的virtual参数被覆盖到动态创建的类中。在这种情况下,[ScriptIgnore]属性也会被覆盖。

这就是为什么您应该使用[ScriptIgnore(ApplyToOverrides = true)], 以使该[ScriptIgnore]属性在派生类中有效。

于 2017-05-02T19:13:43.023 回答
1

JavaScriptSerializer当你使用的时候return Json)肯定尊重这个[ScriptIgnore]属性。

这是一个证明:

模型:

public class User
{
    public Badge Badge { get; set; }
}

public class Badge
{
    [ScriptIgnore]
    public virtual ICollection<User> Users { get; set; }

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

控制器:

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

如果您[ScriptIgnore]从 Users 属性中删除该属性,您将收到循环引用错误。

所以我猜你的问题出在其他地方。

但我个人建议您使用视图模型而不是那些[ScriptIgnore]属性。

因此,您只需定义一个仅包含给定视图所需的属性的视图模型:

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

然后在您的控制器操作中,您在域模型和视图模型之间进行映射,并将视图模型传递给视图:

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

        return Json(vm, JsonRequestBehavior.AllowGet);
    }
}

如果您厌倦了在控制器中编写映射代码,您只需转到 NuGet 包控制台并键入以下命令:

Install-Package AutoMapper

为了充分利用优秀的AutoMapper库。

于 2012-08-18T07:25:44.333 回答