我有一个人类,就这个问题而言,只是
public class Person
{
[Required(ErrorMessage = "***")]
[Display(Name = "Your full name")]
public string Name { get; set; }
}
我继承了这是在我的投诉课
public class Complaints : Person
{
[Required(ErrorMessage = "***")]
[Display(Name = "Detail of the issue")]
public string Detail{ get; set; }
}
一切都按预期工作。
问题是,我们现在希望用户不需要完整的名字,但我已将其设置为必需。
由于我的Person类在其他地方使用,我无法更改Required属性。
如何覆盖派生类中的DataAnnotations
?我在猜测(这也解释了我的困惑),因为DataAnnotation
属于属性,我不能覆盖DataAnnocation
并且必须覆盖整个属性?
答案 0 :(得分:0)
您可以使用自定义DataAnnotationsModelMetadataProvider
public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
// fiddle with metadata here
return modelMetadata;
}
}
global_asax.cs
protected void Application_Start()
{
ModelMetadataProviders.Current = new CustomModelMetadataProvider();
但是,真正的解决方案是将继承分离为关系。想想“现实世界”中的事物 - 就像狗是动物一样,所以:dog:animal
和狗有一个拥有者所以所有者是狗的财产,狗不是从所有者那里继承的。在这种情况下,由于投诉不是个人,因此该人应该是财产而不是基本情况。