ASP.NET MVC 3 CompareAttributeをコピーしてカスタムのCompareLessThan検証属性を作成し、等価性をチェックする代わりに、あるプロパティが他のプロパティよりも小さいかどうかをチェックします。クライアント側のエラーがある場合、メッセージ '{0}は{1}未満でなければなりません'がユーザーに表示されます。ASP.NET MVC ValidationAttribute他のプロパティの表示名を取得
私のモデルは、リソースファイルを参照する表示属性で次のように設定されています。
[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方法は、ここでは、問題がある場合、ユーザーに表示されるエラーメッセージを生成している
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationLessThanRule(FormatErrorMessage(metadata.DisplayName), FormatPropertyForClientValidation(OtherProperty), this.AllowEquality);
}
CompareAttributeと全く同じです。私は私のカスタムCompareLessThan属性で装飾されているプロパティのリソースファイルから表示名を得ることができますが、私の質問は、私たちが比較している '他の'プロパティの表示名を取得する方法ですか? IsValidメソッドでは、 '他の'プロパティのPropertyInfoオブジェクトを生成するvalidationContextへの参照があり、表示名を取得すると思います。しかし、GetClientValidationRulesではそのアクセス権がありません。
他のプロパティの表示名に別の値を渡すこともできますが、既にデータ注釈を指定しているので、それを派生させる方法があることを期待していました。
アイデア?
プロパティコレクションは常に空です。 –
@NickOlsenそれは悲しいです。私はいくつかの "回避策"で私の答えを更新しました。 – nemesv
それはメタデータとしても機能しません。モデルプロパティは値0だけです。あなたのロジックを使って、私はそれを行う別の方法を考え出すことができました(他の答えを見てください)。誰かが提供できるより良い方法があると私は望んでいる。 –