Атрибут на интерфейсных элементах не работает

В моем приложении несколько моделей нуждаются в свойствах Password (например, Registration и ChangePassword). Свойство Password имеет атрибут типа DataType и Required. Поэтому для обеспечения повторного использования последовательности я создал:

interface IPasswordContainer{
    [Required(ErrorMessage = "Please specify your password")]
    [DataType(DataType.Password)]
    string Password { get; set; }
} 

и

class RegistrationModel : IPasswordContainer {
    public string Password { get; set; }
}

К сожалению, атрибуты не работают.

Затем я попытался изменить интерфейс на класс:

public class PasswordContainer {
    [Required(ErrorMessage = "Please specify your password")]
    [DataType(DataType.Password)]
    public virtual string Password { get; set; }
}

и

public class RegistrationModel : PasswordContainer {
    public override string Password { get; set; }
}

Теперь он работает. Почему это так?

Почему атрибуты работают, когда унаследованы от класса, но не работают, когда унаследованы от интерфейса?

Ответ 1

Атрибуты свойств интерфейса не наследуются к классу, вы можете сделать свой интерфейс абстрактным классом.

Найден ответ от Microsoft:

Команда разработчиков не хочет реализовывать эту функцию, для двух основных Причины:

  • Согласованность с DataAnnotations.Validator
  • Согласованность с проверкой поведения в ASP.Net MVC
  • сложный сценарий: класс реализует два интерфейса, которые имеют одно и то же свойство, но с конфликтующими атрибутами. Который атрибут будет иметь приоритет?