Domanda

Questo sembra che dovrebbe avere una soluzione semplice, ma io non riesco a trovarlo.

Sto utilizzando il controllo ChangePassword in un'applicazione ASP.NET 2.0, utilizzando sia il ChangePasswordTemplate e SuccessTemplate per definire uno stile personalizzato. Le caselle di testo dispongono di ID come segue

attuale Login Password Casella di testo = CurrentPassword
Nuovo ID password Casella di testo = NuovaPassword
Conferma nuova password ID = Casella di testo ConfirmPassword

Per motivi DRY, voglio usare l'espressione regolare che viene definito nel provider personalizzato appartenenza per convalidare il nuovo lato client password. Purtroppo, l'impostazione delle proprietà del controllo ChangedPassword come segue

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

nel Page_Init imposta l'espressione al valore atteso, ma non causa la convalida lato client per accadere sulla nuova password (la pagina viene rinviata e il testo fallimento Membership ChangePassword di serie viene visualizzato).

ho potuto utilizzare un RegularExpressionValidator nel ChangePasswordTemplate e impostare la proprietà ValidationExpression al Membership.PasswordStrengthRegularExpression, ma il modo migliore che posso vedere per fare questo richiede recursing attraverso i controlli nel modello per trovare il RegularExpressionValidator e impostando la proprietà, il che mi fa credere che ci deve essere un modo più elegante. Ho altri controlli di convalida nel modello (campi richiesti e un validatore confrontare), nel caso in cui questo potrebbe essere la causa di un conflitto con utilizzando le proprietà di validazione ChangePassword.

La mia domanda è, allora, funziona proprietà ChangePassword del controllo NewPasswordRegularExpression quando si utilizzano modelli o ho bisogno di imboccare la strada di controllo RegularExpressionValidator?

Modifica

offerto una taglia su questo come non riesco a trovare una risposta definitiva sul perché di proprietà ChangePassword del controllo NewPasswordRegularExpression non convalida lato client.

È stato utile?

Soluzione

Se si utilizza "Convert to template", il controllo RegularExpressionValidator non viene creata automaticamente e, pertanto, non ha reso alla pagina finale. Questo può essere confermato visualizzando il sorgente della pagina, prima e dopo la conversione al modello.

Per aggiungere un RegularExpressionValidator esattamente come quella ASP.NET utilizza senza il modello, definirlo tra il NuovaPassword TextBox e la RequiredFieldValidator in questo modo:

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

Non è possibile utilizzare la proprietà NewPasswordRegularExpression del ChangePassword di modificare l'espressione regolare a questo punto. Dovrete fare questo, invece:

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

Spero che questo aiuta.

Altri suggerimenti

Ci dispiace c'è voluto troppo misi molto a tornare.

PasswordStrengthRegularExpression viene convalidato al lato server. e NewPasswordRegularExpression convalidato al lato client. E qui è la differenza. A causa di bug nella convalida JSScript / VSScript Regx, ogni espressione regolare che viene convalidato sul server non sarà convalidato in browswer.

Inoltre, la password viene ottenere convalidato con NewPasswordRegularExpression pure PasswordStrengthRegularExpression. Quindi NewPasswordRegularExpression non dovrebbe rompere la regola definita in PasswordStrengthRegularExpression.

es.

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

funziona bene.

Spero che questo ti aiuta.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top