Запретить наследование атрибутов проверки в модели
Я использую базовую модель контактов, которую наследуют другие пользовательские классы моделей контактов.
public class BaseContactModel
{
[Required(ErrorMessage = "Firstname is required")]
public virtual string FirstName { get; set; }
}
Базовая модель контакта использует атрибуты проверки, чтобы пометить свойство обязательно, но в некоторых случаях я хочу переопределить или остановить это. Это будет возможно?
public class ContactModel : BaseContactModel
{
[NotRequired]
public override string FirstName { get; set; }
}
Я попытался использовать новый атрибут проверки NotRequired, чтобы просто вернуть значение true, но похоже, что атрибуты просто суммируются, поэтому Required & NotRequired запущены, а проверка не пройдена.
При поиске решений (которые я не смог найти) я обнаружил, что некоторые несвязанные атрибуты имеют свойство "унаследовано", но я не вижу этого в собственных атрибутах проверки в System.ComponentModel.DataAnnotations.
Это безнадежное дело? Нужно ли накатывать свои собственные версии, которые бы поддерживали отключение наследования? Любая помощь с благодарностью.
2 ответа
Смотрите это ниже, я создал один класс Model
что наследует от другого BaseModel
, использовал новое ключевое слово, затем проверял один из каждого экземпляра. Из того, что я вижу, они оба используют базовые атрибуты.
Я добавил класс управления ControlModel
для ясности в процедуре проверки.
class Program
{
static void Main(string[] args)
{
ValidationTest<Model>();
ValidationTest<BaseModel>();
ValidationTest<ControlModel>();
Console.Read();
}
private static void WriteAttributeInfo<T>()
{
Console.WriteLine(string.Concat(typeof(T), " attributes:"));
typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList();
}
private static void ValidationTest<T>()
{
object obj = Activator.CreateInstance<T>();
Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>())));
}
}
class ControlModel
{
public string FirstName { get; set; }
public string Email { get; set; }
}
class BaseModel
{
[RequiredAttribute]
public virtual string FirstName { get; set; }
[RequiredAttribute]
public virtual string Email { get; set; }
}
class Model : BaseModel
{
public new string FirstName { get; set; }
public new string Email { get; set; }
}
ConsoleApplication1.Model test: isValid = False
ConsoleApplication1.BaseModel test: isValid = False
ConsoleApplication1.ControlModel test: isValid = True
Из этого примера видно, что вы не можете переопределить / скрыть / игнорировать унаследованные обязательные атрибуты проверки (еще не пробовали другие).
Это может быть тот случай, когда вы действительно хотите новую собственность
public class ContactModel : BaseContactModel
{
[NotRequired]
public new string FirstName { get; set; }
}