2010-03-22 4 views
1

Je suis en train de mettre en œuvre cette Captcha et étant donné qu'il ne dispose pas d'option pour générer une nouvelle image que je suis en train de construire un et je fais ceci:Aspx chargé uniquement 1 fois

private Panel buildCaptchaElement(XmlNode node) 
     { 
      Panel p1 = new Panel(); 
      Label l = new Label(); 
      l.Text = node.ChildNodes[3].InnerText; 
      TextBox tb = new TextBox(); 
      tb.ID = "Captcha_Tb"; 

      System.Web.UI.WebControls.Image img = new System.Web.UI.WebControls.Image(); 
      img.ID = "Captcha_Img"; 
      img.ImageUrl = this.ResolveUrl("Turing.aspx"); 
      img.Width = new Unit(140, UnitType.Pixel); 
      img.Height = new Unit(70, UnitType.Pixel); 

      LinkButton linkB = new LinkButton(); 
      linkB.ID = "Captcha_linkB"; 
      linkB.Text = "Can't read? Generate a new image."; 
      linkB.Click += new EventHandler(linkB_Click); 

      p1.Controls.Add(new Literal() { Text = "<table><tr><td>" }); 
      p1.Controls.Add(l); 
      p1.Controls.Add(new Literal() { Text = "<br/>" }); 
      p1.Controls.Add(img); 
      p1.Controls.Add(new Literal() { Text = "<br/>" }); 
      p1.Controls.Add(tb); 
      p1.Controls.Add(new Literal() { Text = "<br/>" }); 
      p1.Controls.Add(linkB); 
      p1.Controls.Add(new Literal() { Text = "</td></tr></table>" }); 
      return p1; 
     } 

     void linkB_Click(object sender, EventArgs e) 
     { 
      System.Web.UI.WebControls.Image img = FindControl("Captcha_Img") as System.Web.UI.WebControls.Image; 
      img.ImageUrl = "Turing.aspx"; 
     } 

Qu'est-ce qui se passe est que lorsque je tente de générer une nouvelle image, il ne fait pas la page_load de "Turing.aspx" aucune idée pourquoi?

Mise à jour: J'ajoute dynamiquement des éléments à une page, l'un d'eux est un captcha avec le code disponible dans ce lien Captcha, les seules modifications que j'ai faites a été la création d'éléments pour le captcha dynamiquement comme vous le voyez dans " private Panel buildCaptchaElement (noeud XmlNode) "et ajoutez un bouton de lien pour générer une nouvelle image.

Le code qui génère l'image est la suivante:

public class Turing1 : System.Web.UI.Page 
{ 
private void Page_Load(object sender, System.EventArgs e) 
{ 
Bitmap objBMP =new System.Drawing.Bitmap(60,20); 
Graphics objGraphics = System.Drawing.Graphics.FromImage(objBMP); 
objGraphics.Clear(Color.Green); 
objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias; 
//' Configure font to use for text 
Font objFont = new Font("Arial", 8, FontStyle.Bold); 
string randomStr=""; 
int[] myIntArray = new int[5] ; 
int x; 
//That is to create the random # and add it to our string 
Random autoRand = new Random(); 
for (x=0;x<5;x++) 
{ 
myIntArray[x] = System.Convert.ToInt32 (autoRand.Next(0,9)); 
randomStr+= (myIntArray[x].ToString()); 
} 
//This is to add the string to session cookie, to be compared later 
Session.Add("randomStr",randomStr); 
//' Write out the text 
objGraphics.DrawString(randomStr, objFont, Brushes.White, 3, 3); 
//' Set the content type and return the image 
Response.ContentType = "image/GIF"; 
objBMP.Save(Response.OutputStream, ImageFormat.Gif); 
objFont.Dispose(); 
objGraphics.Dispose(); 
objBMP.Dispose(); 
} 
} 
+0

Une autre suggestion: Vous devez transformer votre code captcha en un contrôle utilisateur. –

+0

Vous devez également utiliser les instructions "using" au lieu d'appeler explicitement Dispose(). –

+0

Pourriez-vous également publier l'en-tête de votre page .aspx? –

Répondre

0

Il n'y a pas assez d'informations dans votre question. S'il vous plaît poster le code complet de votre page.

Cela dit, les informations données, je soupçonne que ce soit:

  • Votre navigateur est la mise en cache le code HTML après la page charge la première fois ou
  • AutoEventWireup n'est pas activé et donc page_load n'est pas appelé

Il existe un certain nombre de façons prevent the browser caching la sortie de Turing.aspx.

0

Si vous avez autoeventwireup activé dans l'en-tête de la page .aspx, alors il exécutera automatiquement l'événement de chargement de page s'il a la bonne signature de méthode.

Si vous avez AutoEventWireup désactivé, vous devez changer votre méthode pour cela:

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    // Your code goes here. 
    // ... 
} 

Assurez-vous que votre signature de méthode est correcte, ou la commande la page de base événement classe OnLoad.

Encore une chose. Dans votre gestionnaire d'événement onload, vous pouvez avoir du code qui fait référence à la propriété Page IsPostBack. assurez-vous que vous êtes pas faire si vous voulez que le code pour obtenir appelé postback:

if(!IsPostBack) 
{ 
    // Code that wont get called on postback 
    // ... 
} 

Une dernière chose. Il peut être judicieux d'utiliser simplement un captcha pré-construit, au lieu d'un captcha. Je recommanderais reCAPTCHA. Très facile à intégrer avec une application ASP.NET.

MISE À JOUR

Je ne sais pas si la remise à zéro ImageUrl va rafraîchir l'image. Ce n'est pas la solution, mais essayez d'ajouter un paramètre querystring à ImageUrl lors de la publication, juste pour voir si l'image est mise en cache.

+0

Mon autoeventwireup est vrai et je n'ai pas le bloc if (! IsPostBack) sur mon code. Merci pour la pointe de la reCAPTCHA mais je ne peux pas utiliser dans mon cas. – SlimBoy

Questions connexes