ASP.NET MVC 3 CompareAttributeをコピーして、カスタムのCompareLessThan検証属性を作成しました。等しいかどうかを確認する代わりに、あるプロパティが別のプロパティよりも小さいことを確認します。クライアント側のエラーがある場合は、メッセージ「{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への参照があり、そこから「other」プロパティのPropertyInfoオブジェクトを生成でき、表示名を取得できると思います。しかし、GetClientValidationRulesではアクセスできません。
他のプロパティの表示名にはいつでも別の値を渡すことができましたが、データアノテーションですでに指定しているので、それを導出する方法があることを期待していました。
何か案は?