Я столкнулся с сценарием, где мне нужно было знать, какое свойство в настоящее время проверялось в пользовательском ValidationAttribute
. Я предположил, что это будет легко в MVC 3, поскольку ValidationContext
передается в метод IsValid
.
Не вдаваясь в подробности, вот основная идея:
protected override ValidationResult IsValid(Object value, ValidationContext validationContext) {
if (ShouldICareAboutYou(validationContext.MemberName))
{
//Do some stuff
}
//Return the results
}
Это казалось идеальным решением, и действительно, когда модульное тестирование моего пользовательского ValidationAttribute с помощью Validator.TryValidateObject
, все работало красиво!
ОДНАКО...
При вызове TryUpdateModel
или TryValidateModel
внутри моего контроллера выполняется проверка, но ValidationContext.MemberName
имеет значение null.
Whaa Huh?!?
Я сделал небольшое исследование и, конечно, прямо внутри DataAnnotationsModelValidator
- это код... или его отсутствие.
public override IEnumerable<ModelValidationResult> Validate(object container) {
// Per the WCF RIA Services team, instance can never be null (if you have
// no parent, you pass yourself for the "instance" parameter).
ValidationContext context = new ValidationContext(container ?? Metadata.Model, null, null);
context.DisplayName = Metadata.GetDisplayName();
// Setting the MemberName here would be trivial!
// However, philh told me not to. Something about
// a guy named Josh who pushed him down on the playground
// in middle school.
//context.MemberName = Metadata.PropertyName; (Suck It, Josh!!!)
ValidationResult result = Attribute.GetValidationResult(Metadata.Model, context);
if (result != ValidationResult.Success) {
yield return new ModelValidationResult {
Message = result.ErrorMessage
};
}
}
Я понимаю, что DisplayName
может быть именем свойства, если в свойство не было применено DisplayAttribute
. К сожалению, я не могу заниматься гипотезами. Мне нужно знать точно, что такое имя свойства.
Так в чем заключена сделка? Является ли это по дизайну или честному надзору. Если это недосмотр, тогда было бы здорово получить это исправление в MVC 4:)
Отказ от ответственности:
Добавленные комментарии в приведенном выше примере кода должны быть смешными. Я не знаю, и никогда не встречал Phil Haack. Из того, что я могу сказать, он кажется очень хорошим парнем. И толкание его в средней школе сделало бы меня королевским душем!