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
ものとは異なることです。MemberName
ModelState
Guid
[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
。とにかくこれは動的でなければなりません。
これを克服する方法を知っていますか?