Я создал собственный атрибут проверки CompareLessThan, скопировав ASP.NET MVC 3 CompareAttribute, и вместо проверки на равенство я проверяю, чтобы увидеть, что одно свойство меньше другого. Если имеется ошибка на стороне клиента, пользователю отображается сообщение «{0} должно быть меньше {1}».
Моя модель настроена следующим образом с атрибутами Display, ссылающимися на файл ресурсов.
[CompareLessThan("AmountAvailable", ErrorMessageResourceName="CompareLessThan", ErrorMessageResourceType = typeof(Resources.ValidationMessages))]
[Display(Name = "Amount", ResourceType = typeof(Resources.Labels))]
public decimal Amount { get; set; }
[Display(Name = "AmountAvailable", ResourceType = typeof(Resources.Labels))]
public decimal AmountAvailable { get; set; }
Тогда пользовательский метод проверки GetClientValidationRules точно такой же, как в CompareAttribute
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationLessThanRule(FormatErrorMessage(metadata.DisplayName), FormatPropertyForClientValidation(OtherProperty), this.AllowEquality);
}
Здесь мы генерируем сообщение об ошибке, которое будет отображаться пользователю в случае возникновения проблемы. Я могу получить отображаемое имя из файла ресурсов для свойства, которое украшено моим настраиваемым атрибутом CompareLessThan, но у меня вопрос: как мне получить отображаемое имя свойства «other», с которым мы сравниваем? В методе IsValid у нас есть ссылка на validationContext, из которого я могу сгенерировать объект PropertyInfo для свойства 'other' и, думаю, получить отображаемое имя. Но в правилах GetClientValidation у меня нет доступа к этому.
Я всегда мог просто передать другое значение для отображаемого имени другого свойства, но я надеялся, что будет способ получить его, так как я уже указываю его с аннотациями данных.
Есть идеи?