Steven Sanderson による@Html.BeginCollectionItemヘルパーを使用しているときに、 IValidatableObjectインターフェイスを使用してサーバー側でコレクション項目を検証しようとしています。
ユーザーが 2 つの等しいアイテムを選択できないようにしたい。したがって、たとえば、ユーザーが話すイディオムのリストが与えられた場合、これらの値をポストバックできます。
English
English
Spanish
実装は次のValidateようになります。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach(var idiom in Idioms)
{
if(Idioms.Any(i => i != idiom && i.Idiom == idiom.Idiom))
{
yield return new ValidationResult("Idiom already selected", new string[] { "Idiom" });
}
}
}
これの問題は、スティーブンのヘルパーが を使用し、次のように見えるためMemberName、 に渡された ("Idiom") が辞書にあるValidationResultものとは異なることです。MemberNameModelStateGuid
[42] = {[Idioms[83c2c6db-0157-42f3-bf3f-f7c9e6bc0a37].Idiom, System.Web.Mvc.ModelState]}
ご覧のとおりIdiom != [Idioms[83c2c6db-0157-42f3-bf3f-f7c9e6bc0a37].Idiom。
最良の場合、たとえば[Idioms[83c2c6db-0157-42f3-bf3f-f7c9e6bc0a37].Idiomとして渡す方法MemberNameが必要ですが、 からこの情報を取得する方法がわかりませんvalidationContext。とにかくこれは動的でなければなりません。
これを克服する方法を知っていますか?