ASP.NET MVC ValidationAttribute Get Other Property Display Name

Я создал пользовательский атрибут проверки CompareLessThan, скопировав атрибут CompareAttribute из ASP.NET MVC 3, и вместо проверки равенства проверяю, что одно свойство меньше другого. Если возникает ошибка на стороне клиента, пользователю выводится сообщение '{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, но мой вопрос в том, как мне получить отображаемое имя "другого" свойства, с которым мы сравниваем? В методе IsValid у нас есть ссылка на validationContext, из которого я могу создать объект PropertyInfo для "другого" свойства и получить отображаемое имя. Но в GetClientValidationRules у меня нет доступа к этому.

Я всегда могу просто передать другое значение для отображаемого имени другого свойства, но я надеялся, что есть способ получить его, поскольку я уже указываю его в аннотации данных.

Есть идеи?

7
задан Nick Olsen 14 October 2011 в 04:39
поделиться