Asp.net mvc 3 将[JsonIgnore]应用于属性会导致DataAnnotation属性为;“丢失”;

Asp.net mvc 3 将[JsonIgnore]应用于属性会导致DataAnnotation属性为;“丢失”;,asp.net-mvc-3,data-annotations,json.net,Asp.net Mvc 3,Data Annotations,Json.net,给定以下代码: [JsonIgnore] [Display(Name = "Loan Cap")] public virtual string SomeProperty { get; protected set; } 当ASP.NET MVC调用DataAnnotationsModelMetadataProvider.CreateMatadata以完成以下调用时: @Html.DisplayNameFor(model => model.SomeAttribute)

给定以下代码:

    [JsonIgnore]
    [Display(Name = "Loan Cap")]
    public virtual string SomeProperty { get; protected set; }
当ASP.NET MVC调用DataAnnotationsModelMetadataProvider.CreateMatadata以完成以下调用时:

@Html.DisplayNameFor(model => model.SomeAttribute)

交给CreateMatadata的属性列表不包括[Display]属性(或者[JsonIgnore]属性)。如果删除[JsonIgnore],则会找到[Display]并将其传递给CreateMatadata。有人知道为什么会发生这种情况吗?

在旧版本的Newtonsoft.Json nuget包中,这似乎是一个bug/问题。
我确认该问题存在于包的9.0.1版本中

此问题在10.0.1版中已修复


在我的例子中,我在执行时收到实体框架迁移挂起的更改错误,但不是来自PackageManager控制台。我发现这是因为同一个问题,导致控制台命令“丢失”所有属性的JsonIgnore属性、“更新数据库”和“添加迁移”仍然看到ForeignKey属性。但是,如果代码正在执行,Entity Framework没有看到ForeignKey属性,并抛出了一个挂起的更改迁移错误。

为什么您的
SomeAttribute
是虚拟的?当您将
JsonIgnore
放在对象上时,可能会传递一个对象作为覆盖
SomeAttribute
的模型。你能再贴一些上下文吗?由于
JsonIgnore
是第三方库的一部分,因此
DataAnnotationsModelMetadataProvider.CreateMetadata
-是.net fw的一部分-无法专门处理它,因此您的问题将出现在其他地方。很抱歉,在我匆忙发表文章时,我称它为SomeAttribute,我指的是SomeProperty(并对它进行了编辑以反映这一点). 我不想让CreateMatadata处理JsonIgnore,但将JsonIgnore放在属性上会导致所有其他属性丢失。应用[JsonIgnore]的更正会导致所有属性丢失(包括JsonIgnore)