如何覆盖DataAnnotations

时间:2015-06-21 09:14:14

标签: asp.net-mvc-4

我有一个人类,就这个问题而言,只是

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并且必须覆盖整个属性?

1 个答案:

答案 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和狗有一个拥有者所以所有者是狗的财产,狗不是从所有者那里继承的。在这种情况下,由于投诉不是个人,因此该人应该是财产而不是基本情况。