Pregunta

Esta parece que debería tener una solución sencilla pero me parece que no puede encontrarlo.

Estoy usando el control ChangePassword en una aplicación ASP.NET 2.0, utilizando tanto el ChangePasswordTemplate y SuccessTemplate para definir un estilo personalizado. Los cuadros de texto tienen ID de la siguiente manera

contraseña actual del cuadro de texto ID = CurrentPassword
Nueva contraseña de cuadro de texto ID = contraseñaNueva
Confirmar nueva contraseña del cuadro de texto ID = ConfirmPassword

Por razones DRY, quiero usar la expresión regular que se define en el proveedor de suscripciones personalizado para validar la nueva contraseña en el cliente. Por desgracia, el establecimiento de la propiedad del control de ChangedPassword de la siguiente manera

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

en Page_Init establece la expresión con el valor esperado, pero no causa la validación del lado del cliente para suceder en la nueva contraseña (la página envía el texto y el fracaso de miembro ChangePassword estándar se muestra).

Me vendría bien un RegularExpressionValidator en el ChangePasswordTemplate y establezca la propiedad ValidationExpression a Membership.PasswordStrengthRegularExpression pero la mejor manera que puedo ver para ello requiere de manera recursiva a través de los controles en la plantilla para encontrar el RegularExpressionValidator y el establecimiento de la propiedad, lo que me hace creer que debe haber una forma más elegante. Tengo otros controles de validación en la plantilla (campos requeridos y un validador de comparar), en caso de que esto puede ser la causa de un conflicto con el uso de las propiedades de validación ChangePassword.

Mi pregunta es, entonces, funciona ChangePassword propiedad del control NewPasswordRegularExpression cuando el uso de plantillas o tengo que ir por la vía del control RegularExpressionValidator?

EDIT:

Se ofrece una recompensa por esto, ya que no puedo encontrar una respuesta definitiva de por qué la propiedad ChangePassword del control NewPasswordRegularExpression no valida el lado del cliente.

¿Fue útil?

Solución

Si utiliza "Convertir a la plantilla", el control RegularExpressionValidator no se crea de forma automática y por lo tanto no vuelve a la última página. Esto se puede confirmar mediante la visualización de la fuente de la página antes y después de la conversión a la plantilla.

Para añadir un RegularExpressionValidator exactamente como la que ASP.NET utiliza sin la plantilla, definirlo entre el contraseñaNueva cuadro de texto y el RequiredFieldValidator como esto:

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

No se puede utilizar la propiedad NewPasswordRegularExpression del ChangePassword para cambiar la expresión regular en este punto. Vas a tener que hacer esto en su lugar:

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 esto ayude.

Otros consejos

En este momento me tomó demasiado tiempo para volver.

PasswordStrengthRegularExpression se valida del lado del servidor. y NewPasswordRegularExpression validado en el lado del cliente. Y aquí está la diferencia. Debido al error en la validación JSScript / VSScript Regx, cada expresión regular que se validó en el servidor no será validado en browswer.

Además, la contraseña se consigue validado con NewPasswordRegularExpression así PasswordStrengthRegularExpression. Así NewPasswordRegularExpression no debe romper la regla definida en PasswordStrengthRegularExpression.

por ejemplo.

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

funciona bien.

Espero que esto le ayuda.

Actualizar : expresión regular de búsqueda hacia delante fallo.
http://blog.stevenlevithan.com/archives/regex-lookahead-bug

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top