ASP.NET MVC 3での検証の完全ガイドの例を使用して、 RequiredIf検証属性を作成しています(「より複雑なカスタムバリデーター」という見出しの下のページの約1/3です)。1つのシナリオを除いて、すべて正常に機能します。それは、複雑なタイプに対して検証する必要がある場合です。たとえば、次のモデルがあります。
public class MemberDetailModel
{
public int MemberId { get; set; }
// Other model properties here
public MemberAddressModel HomeAddress { get; set; }
public MemberAddressModel WorkAddress { get; set; }
}
public class MemberAddressModel
{
public bool DontUse { get; set; }
// Other model properties here
[RequiredIf("DontUse", Comparison.IsEqualTo, false)]
public string StreetAddress1 { get; set; }
}
問題は、StreetAddressプロパティの属性検証がレンダリングされるときに、の属性で装飾されることですdata-val-requiredif-other="DontUse"
。残念ながら、アドレスはメインモデルのサブタイプであるため、DontUseだけでなく、HomeAddress_DontUseという名前で装飾する必要があります。
不思議なことに、検証はサーバー側の検証では正常に機能しますが、JSは「DontUse」という名前のオブジェクトを見つけることができないため、クライアント側の控えめな検証はJSエラーで失敗します。
したがって、ModelClientValidationRequiredIfRuleメソッドを変更して、検証しているプロパティが親タイプのサブタイプであることを確認する方法を見つける必要があります。その場合は、ParentType_
を「otherProperty」フィールドの前に追加します(たとえば、otherPropertyはになりHomeAddress_DontUse
ます。
属性のパラメーターとして渡そうとしましtypeof(MemberAddressModel)
たが、属性の作成をデバッグしているときでも、そのタイプからHomeAddressまたはWorkAddressの親タイプへの参照が見つからないようです。