0

次の状況を満たす MVC モデル検証属性を作成しようとしています: ビューの複数の入力フィールド (月、日、年、市外局番、交換、サフィックス)。

  public class PhoneNumber
  {
    [RegularExpression("^([2-9][0-8][0-9])$", ErrorMessage = "Invalid Area Code")]
    public virtual string AreaCode { get; set; }

    [RegularExpression("^([2-9][0-9][0-9])$", ErrorMessage = "Invalid Phone Exchange")]
    public virtual string Exchange { get; set; }

    [RegularExpression("^([0-9][0-9][0-9][0-9])$", ErrorMessage = "Invalid Phone Suffix")]
    public virtual string Suffix { get; set; }
  }

私はよくこれらのモデルを他のモデルの中に入れ子にします (たとえば、Person には PhoneNumber と Birthday があります)。私の見解では、PhoneNumber が必要な場合もあれば、そうでない場合もあります。クラスを IValidatableObject として実装することにより、サーバー側でこれらの状況を処理できますが、クライアント側の検証を行う場合、または属性を介してサーバー側の検証を行う場合でも問題が発生します。

独自のカスタム検証属性を作成する必要があると思いますが、複数のレベルでオブジェクトおよび属性情報にアクセスする際にどこから始めればよいかさえわかりません。誰もこのようなことに遭遇しましたか?私を正しい方向に向けるための良いアイデアはありますか?

前もって感謝します!

- - - - アップデート - - -

IClientValidatable と GetClientValidationRules を使用することで、コンテナーの型を取得できる ModelMetadata にアクセスできます。問題は、コンテナーが最上位モデルの型ではなく、誕生日または電話番号であることです。これは、ここで最も重要なことです。ModelMetadata は、Model プロパティがまだ存在しない可能性があるため、まだ設定されていません。私が実際にやろうとしているのは、最上位モデルの型を取得することです。誰にも洞察がありますか?

4

1 に答える 1

0

ビューの書き方によっては、BeginCollectionItem http://nuget.org/packages/BeginCollectionItemという拡張機能を見たいと思うかもしれません。

あなたがやっている場合、検証は少し台無しになります

@Html.TextBoxFor( m => number.AreaCode )

それ以外の

@Html.TextBoxFor( m => m.AreaCode )
于 2012-08-08T19:10:45.150 に答える