3

次の正規表現注釈があります。

    [RegularExpression(@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})", ErrorMessage = "Password is not strong enough!")]
    public string Password { get; set; }

これは、「admin1*」などのパスワードで登録できるため、MembershipProvider で使用する正規表現からのコピー/貼り付けです。この正規表現を RegexHero でもテストしましたが、動作します。

フォームをコントローラーにポストバックすると、値も存在しますが、モデルは検証されません。

誰でもこれが何であるかについての手がかりを持っていますか?

前もって感謝します、

編集:

5 つの数字のみを含む文字列を検証する Regex でテストし、12345 を入力すると検証され、「abc」などの他の文字列で失敗しました。したがって、正規表現メカニズムは機能しているようです..

4

1 に答える 1

3

正規表現は問題ありません。問題は、でIsValidメソッドをどのように実装するかですRegularExpressionAttriubte。入力は、開始からパターン全体に一致する場合にのみ有効になるためです。

IsValidResharperによって見られる方法の抜粋:

public override bool IsValid(object value)
{
  //...
  Match match = this.Regex.Match(input);
  if (match.Success && match.Index == 0)
    return match.Length == input.Length;
  else
    return false;
}

パターン@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})は入力と一致しますadmin1*match.SuccessGrouping構造trueを使用しているため、は常にであり、は常にと評価されます。match.Legth0match.Length == input.Lengthfalse

をチェックするだけで、一致の長さを気にしないMembershipProviderため、で機能します。match.Success

私は2つの可能な解決策を見ます:

  1. グループ化構造を使用しないように正規表現パターンを書き直します(私は正規表現が苦手なので、ここでは役に立ちません)
  2. 独自のRegularExpressionAttriubte(または組み込みのものから派生した)ものを作成します。IsValidメソッド内でチェックするだけです。match.Success
于 2012-08-03T06:02:25.790 に答える