Атрибут на интерфейсных элементах не работает
В моем приложении несколько моделей нуждаются в свойствах 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
- сложный сценарий: класс реализует два интерфейса, которые имеют одно и то же свойство, но с конфликтующими атрибутами. Который атрибут будет иметь приоритет?