2015-06-21 3 views
1

У меня есть человек класс, который для целей данного вопроса, является простоКак переопределить 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 используется else, где я не могу изменить атрибут Required.

Как я могу переопределить DataAnnotations в моем производном классе? Я предполагаю (что также объясняет мое замешательство), потому что DataAnnotation принадлежит собственности, которую я не могу просто переопределить DataAnnocation и должен переопределить всю собственность?

+1

Используйте ключевое слово 'new'. Добавьте свойство 'Complaints' -' public new string Name {get; задавать; } '(без атрибута) или лучше, используйте модели представления. –

+0

Спасибо. Как использовать ViewModel в этом экземпляре и как он отличается от класса со свойствами @StephenMuecke? – MyDaftQuestions

+0

Модель просмотра - это класс, специфичный для представления. См. [Что такое ViewModel в MVC?] (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 и собака имеет владельца, поэтому владелец является собственностью собаки, собака не наследует от владельца. В этом случае лицо должно быть имуществом, а не базовым, поскольку жалоба не является лицом.

Смежные вопросы