1

これには簡単な解決策があるはずですが、見つけられないようです。

ChangePasswordASP.NET 2.0 アプリケーションでコントロールを使用しており、 と の両方を使用してカスタムChangePasswordTemplateスタイルSuccessTemplateを定義しています。テキストボックスの ID は次のとおりです。

        現在のパスワード テキストボックス ID = CurrentPassword
             新しいパスワード テキストボックス ID = NewPassword
新しいパスワードの確認 テキストボックス ID = ConfirmPassword

理由DRYにより、カスタム メンバーシップ プロバイダーで定義されている正規表現を使用して、クライアント側の新しいパスワードを検証したいと考えています。残念ながら、ChangedPasswordコントロールのプロパティを次のように設定すると

ChangePassword.NewPasswordRegularExpression = 
    Membership.PasswordStrengthRegularExpression;
ChangePassword.NewPasswordRegularExpressionErrorMessage = 
    "Regex Error Message";

inPage_Initは式を期待値に設定しますが、新しいパスワードでクライアント側の検証が行われることはありません (ページがポストバックされ、標準のメンバーシップChangePassword失敗テキストが表示されます)。

で を使用しRegularExpressionValidatorてプロパティをChangePasswordTemplate設定することもできますが、これを行うには、テンプレートのコントロールを再帰的に検索してプロパティを設定する必要があります。これにより、よりエレガントな方法が必要であると思います. これが検証プロパティの使用と競合する可能性がある場合に備えて、テンプレートに他のバリデータ コントロール (必須フィールドと比較バリデータ) があります。ValidationExpressionMembership.PasswordStrengthRegularExpressionRegularExpressionValidatorChangePassword

私の質問は、テンプレートを使用するときにChangePasswordコントロールのプロパティが機能するか、それともコントロール ルートNewPasswordRegularExpressionをたどる必要があるかということです。RegularExpressionValidator

編集:

ChangePasswordコントロールのNewPasswordRegularExpressionプロパティがクライアント側を検証しない理由について決定的な答えが見つからないため、これについて報奨金を提供しました。

4

2 に答える 2

2

「テンプレートに変換」を使用する場合、RegularExpressionValidator コントロールは自動的に作成されないため、最終ページにレンダリングされません。これは、テンプレートに変換する前後のページ ソースを表示することで確認できます。

ASP.NET がテンプレートなしで使用するものとまったく同じように、RegularExpressionValidator を追加するには、NewPassword TextBox と RequiredFieldValidator の間に次のように定義します。

<asp:TextBox ID="NewPassword" runat="server" TextMode="Password"></asp:TextBox>

<asp:RegularExpressionValidator ID="NewPasswordRegExp" runat="server"
    ErrorMessage="RegularExpressionValidator" Display="Dynamic"
    ControlToValidate="NewPassword" ValidationGroup="ChangePassword1"></asp:RegularExpressionValidator>

<asp:RequiredFieldValidator ID="NewPasswordRequired" runat="server" 
    ControlToValidate="NewPassword" ErrorMessage="New Password is required." 
    ToolTip="New Password is required." ValidationGroup="ChangePassword1">*</asp:RequiredFieldValidator>

この時点で、ChangePassword の NewPasswordRegularExpression プロパティを使用して正規表現を変更することはできません。代わりにこれを行う必要があります:

protected void Page_Init(object sender, EventArgs e)
{
    RegularExpressionValidator validator
        = ((RegularExpressionValidator)(ChangePassword1.Controls[0].FindControl("NewPasswordRegExp")));

    validator.ValidationExpression = Membership.PasswordStrengthRegularExpression;
    validator.ErrorMessage = "Regex Error Message";
}

これが役立つことを願っています。

于 2009-11-24T21:54:24.490 に答える
0

申し訳ありませんが、戻ってくるのに時間がかかりすぎました。

PasswordStrengthRegularExpression はサーバー側で検証されます。クライアント側で検証される NewPasswordRegularExpression。そして、ここに違いがあります。JSScript/VSScript Regx 検証のバグにより、サーバーで検証されるすべての正規表現がブラウザーで検証されません。

さらに、パスワードは NewPasswordRegularExpression と PasswordStrengthRegularExpression で検証されます。したがって、NewPasswordRegularExpression は、PasswordStrengthRegularExpression で定義された規則に違反してはなりません。

例えば

passwordStrengthRegularExpression="^*(?=.{7,})(?=(.*\W){1,})(?=(.*\d){1,})"
NewPasswordRegularExpression="^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$"

正常に動作します。

これがお役に立てば幸いです。

更新: 正規表現先読みバグ。
http://blog.stevenlevithan.com/archives/regex-lookahead-bug

于 2009-11-13T16:01:14.277 に答える