2015-06-21 79 views
1

我有一个Person类,这对于这个问题的目的,仅仅是如何覆盖DataAnnotations

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

使用'new'关键字。将一个属性添加到'Complaints' - 'public new string Name {get;组; }(没有属性)或更好的,使用视图模型。 –

+0

谢谢。我如何在这个实例中使用ViewModel,它与具有属性@StephenMuecke的类有什么不同? – MyDaftQuestions

+0

视图模型是特定于视图的类。请参阅[什么是MVC中的ViewModel?](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc) –

回答

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和狗有一个主人,所以主人是狗的财产,狗不会从主人继承。在这种情况下,该人应该是财产而不是基本案件,因为投诉不是人。