我通过复制 ASP.NET MVC 3 CompareAttribute 创建了一个自定义的 CompareLessThan 验证属性,而不是检查相等性,而是检查一个属性是否小于另一个属性。如果存在客户端错误,则会向用户显示消息“{0} 必须小于 {1}”。
我的模型设置如下,显示属性引用资源文件。
[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 中我无权访问它。
我总是可以为另一个属性的显示名称传递另一个值,但我希望有一种方法可以派生它,因为我已经用数据注释指定了它。
有任何想法吗?