1

这似乎应该有一个简单的解决方案,但我似乎找不到它。

ChangePassword在 ASP.NET 2.0 应用程序中使用该控件,同时使用ChangePasswordTemplateSuccessTemplate来定义自定义样式。文本框的 ID 如下

        当前密码文本框 ID = CurrentPassword
             新密码文本框 ID = NewPassword
确认新密码文本框 ID = ConfirmPassword

出于DRY某种原因,我想使用自定义成员资格提供程序中定义的正则表达式来验证新密码客户端。不幸的是,设置ChangedPassword控件的属性如下

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

inPage_Init将表达式设置为预期值,但不会导致客户端验证在新密码上发生(页面回发并显示标准成员资格ChangePassword失败文本)。

我可以RegularExpressionValidator在 the 中使用 aChangePasswordTemplate并将ValidationExpression属性设置为,Membership.PasswordStrengthRegularExpression但我能看到的最好方法是通过模板中的控件递归查找RegularExpressionValidator并设置属性,这让我相信必须有一种更优雅的方式. 我在模板中有其他验证器控件(必填字段和比较验证器),以防这可能导致与使用ChangePassword验证属性发生冲突。

那么我的问题是,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 回答