Pergunta

Isto parece que deve ter uma solução simples, mas eu não consigo encontrá-lo.

Eu estou usando o controle ChangePassword em um aplicativo ASP.NET 2.0, usando tanto o ChangePasswordTemplate e SuccessTemplate para definir um estilo personalizado. As caixas de texto têm IDs como segue

Senha atual caixa de texto ID = CurrentPassword
Nova senha caixa de texto ID = NewPassword
Confirmar Nova Senha caixa de texto ID = ConfirmPassword

Por razões DRY, eu quero usar a expressão regular que é definido no provedor personalizado Membership para validar o lado novo cliente senha. Infelizmente, definindo a propriedade do controle ChangedPassword como segue

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

em Page_Init define a expressão ao valor esperado, mas não causa validação do lado do cliente para acontecer na nova senha (a página envia de volta eo texto fracasso Membership ChangePassword padrão é exibido).

Eu poderia usar um RegularExpressionValidator na ChangePasswordTemplate e defina a propriedade ValidationExpression para Membership.PasswordStrengthRegularExpression mas a melhor maneira que eu posso ver fazer isso exige recursão através dos controles no modelo para encontrar o RegularExpressionValidator e definindo a propriedade, o que me faz acreditar que deve haver uma maneira mais elegante. Eu tenho outros controles de validação do modelo (campos obrigatórios e um validador comparar), caso em que pode estar causando um conflito com usando as propriedades de validação ChangePassword.

A minha pergunta é, então, faz o trabalho propriedade ChangePassword do controle NewPasswordRegularExpression ao usar modelos ou que eu preciso para ir abaixo da rota de controle RegularExpressionValidator?

EDIT:

ofereceu uma recompensa por isso que eu não consigo encontrar uma resposta definitiva quanto ao porquê propriedade ChangePassword do controle NewPasswordRegularExpression faz do lado do cliente não valida.

Foi útil?

Solução

Se você usar "Convert to Template", o controle RegularExpressionValidator não é criado automaticamente e, portanto, não processado para a página final. Isso pode ser confirmado através da visualização do código fonte da página antes e depois de se converter ao modelo.

Para adicionar um RegularExpressionValidator exatamente como o que usa ASP.NET sem o modelo, defini-lo entre o NewPassword TextBox eo RequiredFieldValidator como esta:

<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>

Você não pode usar a propriedade NewPasswordRegularExpression do ChangePassword para mudar a expressão regular neste momento. Você vai ter que fazer isso em vez disso:

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";
}

Espero que isso ajude.

Outras dicas

Infelizmente ele me levou muito tempo para voltar.

PasswordStrengthRegularExpression é validado no lado do servidor. e NewPasswordRegularExpression validadas no lado do cliente. E aqui está a diferença. Devido ao erro na validação JSscript / VSScript RegX, cada expressão regular que é validado pelo servidor não validado em browswer.

Além disso, a senha é se validado com NewPasswordRegularExpression bem PasswordStrengthRegularExpression. Então NewPasswordRegularExpression não deve quebrar a regra definida na PasswordStrengthRegularExpression.

por exemplo.

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

funciona bem.

Espero que isso ajude você.

Atualizar : bug lookahead regex.
http://blog.stevenlevithan.com/archives/regex-lookahead-bug

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top