2009-01-10 5 views
2

J'ai une petite classe qui affiche une alerte via Javascript. J'utilise cette classe sur une page qui vérifie si l'utilisateur a entré un code postal valide. Si un code postal valide n'est pas entré, une alerte est affichée et la page est renvoyée à la même page afin de pouvoir la modifier. S'ils entrent un code postal valide, ils sont redirigés vers une autre page. Le problème est que si ils frappent le bouton de retour sur leur navigateur, l'alerte est affichée indépendamment du fait que le code postal est valide ou non.Script d'alerte enregistré appelé sur BrowserBack

Voici le flux:

page d'entrée Zip -> Entrer votre Zip -> Vérifier Zip

si zip valide -> goto overview.aspx sinon zip valide, la page d'entrée zip goto

Sur overview.aspx, si elles frappent le bouton de retour de leur navigateur, l'alerte est affichée. Je ne veux pas que cela arrive. Voici le code que j'ai pour la classe d'alerte qui fonctionne très bien. Et ci-dessous le code qui vérifie et affiche l'alerte lorsque le LinkButton est cliqué.

protected void GotoReview(object sender, EventArgs e) { 
     if (ValidateZipCode(ZipCode)) { 
      Response.Redirect(string.Format("~/checkout/overview.aspx?pc={0}&zc={1}", 
      ProductCode, ZipCode)); 
     } 
     else { 
      Alert.Show("The entered zip code is invalid. Please ensure the zip code is a valid zip code."); 
     } 
    } 

private bool ValidateZipCode(string zip) { 
     if (zip.Length < 5 || zip.Length > 5) { 
      return false; 
     } 
     if (!Regex.IsMatch(zip, @"^(\d{5}-\d{4})|(\d{5})$")) { 
      return false; 
     } 
     return true; 
    } 

public static class Alert { 
public static void Show(string message) { 
    string cleanMessage = message.Replace("'", "\\'"); 
    string script = "<script type=\"text/javascript\">alert('" + cleanMessage + "');</script>"; 
    Page page = HttpContext.Current.CurrentHandler as Page; 
    if (page != null && !page.ClientScript.IsClientScriptBlockRegistered("alert")) { 
     page.ClientScript.RegisterClientScriptBlock(typeof(Alert), "alert", script); 
    } 
} 

}

Répondre

0

boutons Retour fonctionnent différemment sur tous les navigateurs, certains navigateurs récupérer la nouvelle version, d'autres retourneront simplement ce que le dernier sur le disque la copie est. La meilleure chose à faire ici est probablement de sortir l'ancien javascript et d'ajouter un OnSubmit au formulaire pour vérifier les validations correctes, jquery serait un excellent outil dans ce cas.

Avec cette méthode, peu importe la stratégie de retour des navigateurs, votre alerte ne sera pas appelée à moins qu'ils ne cliquent sur le bouton de soumission.

0

Je pense que se perd la valeur de code postal lorsque vous redirigez (mais le script ajouté reste tel qu'il est). Pourquoi ne pas mettre la validation en javascript (sur la page ayant le champ de saisie du code postal)? Cela ne ressemble pas, la validation a besoin de choses du côté serveur (comme vous faites des vérifications de longueur et de regex)

0

Je peux confirmer que le code postal est correctement stocké (Session ["zc"]), et est envoyé à overview.aspx à partir de zip.aspx. Pour simplifier, lorsque l'utilisateur est sur overview.aspx, et clique sur le bouton de retour de son navigateur, c'est à ce moment que le script Alert s'exécute. J'ai essayé de mettre un point d'arrêt dans le débogueur, mais il n'est jamais appelé. Donc, la seule hypothèse que j'ai maintenant est que les scripts enregistrés sont appelés lorsque vous utilisez le bouton de retour?

Je ne comprends pas pourquoi le script est exécuté en allant retour bien, même si le zip était valide avant d'aller . : \

0

lorsque vous cliquez sur le navigateur LinkButton demande la même page (page d'entrée de code postal), puis est redirigé vers overview.aspx (si tout va bien). Mais lorsque vous cliquez sur le bouton Retour, il semble que le navigateur effectue une demande précédente - valide le code postal, n'affiche pas la page d'entrée du code postal.

Dans tous les cas, il est préférable d'effectuer un tel contrôle sur le client, comme shahkalpesh a déclaré

Questions connexes