2015-06-21 75 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和狗有一個主人,所以主人是狗的財產,狗不會從主人繼承。在這種情況下,該人應該是財產而不是基本案件,因爲投訴不是人。