Ответ 1
Хорошо. Я нашел обходное решение для этого, добавив новое свойство в класс:
public bool AddressIsRequired { get; set; }
Я мог бы установить это при создании моей модели для разных форм, а затем вместо обычного нормального атрибута я сделал свой собственный валидатор:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class AddressRequiredAttribute : RequiredAttribute, IClientValidatable
{
public AddressRequiredAttribute()
: base()
{
}
protected override ValidationResult IsValid(object value, ValidationContext context)
{
Type addresType = typeof(AddressModel);
if (context.ObjectType == addresType || context.ObjectType.BaseType == addresType)
{
AddressModel baseModel = (AddressModel)context.ObjectInstance;
if (baseModel != null && baseModel.AddressIsRequired)
{
return base.IsValid(value, context);
}
}
return ValidationResult.Success;
}
}
И затем в моей AddressModel я мог бы отметить мои свойства как таковые:
[AddressRequired(ErrorMessage = "Please enter your Postcode")]
public string Postcode { get; set; }
Я собираюсь оставить это открытым, если кто-то сможет найти лучший способ сделать это (т.е. сможет просто изменить аннотацию данных, не создавая отдельный атрибут). Этот способ делать вещи также означает, что если вы расширяете помощника labelfor и используете метаданные, чтобы проверить флаг IsRequired, свойства, помеченные этим атрибутом, всегда будут отмечены как требуется (я думаю, это может быть потому, что он наследуется от требуемого атрибута)