1

Hi i have issues with my captcha code, it doesnt want to refresh when the user gets the code the wrong.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Mail;
using System.IO;

public partial class CAPTCHA_Contact : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {
        //ImageVerification
        if (!IsPostBack)
        {
            SetVerificationText();
        }
    }

    public void SetVerificationText()
    {
        Random ran = new Random();

        int no = ran.Next();

        Session["Captcha"] = no.ToString();
    }

    protected void CAPTCHAValidate(object source, ServerValidateEventArgs args)
    {
        if (Session["Captcha"] != null)
        {
            if (txtVerify.Text != Session["Captcha"].ToString())
            {
                SetVerificationText();

                args.IsValid = false;

                return;

            }
        }
        else
        {
            SetVerificationText();

            args.IsValid = false;

            return;
        }
    }

    protected void btnSave_Click(object sender, EventArgs e)
    {
        if (!Page.IsValid)
        {
            return;
        }

        SetVerificationText();

        //Save the content
        MailMessage mail = new MailMessage();
        mail.From = new MailAddress(EmailTB.Text);
        mail.To.Add("test@hotmail.co.uk");
        mail.CC.Add("another_test@hotmail.co.uk");
        mail.Subject = "Web Quote";
        mail.IsBodyHtml = true;
        mail.Body = "First Name: " + FNameTB.Text + "<br />";
        mail.Body += "Email: " + EmailTB.Text + "<br />";
        mail.Body += "Telephone: " + TelephoneTB.Text + "<br />";
        mail.Body += "Query: " + QueryDD.Text + "<br />";
        mail.Body += "Comments: " + CommentsTB.Text + "<br />";


        SmtpClient smtp = new SmtpClient();
        smtp.Host = "localhost";
        smtp.Send(mail);

        sucessPH.Visible = true;
    }

    protected void Reset(object s, EventArgs e)
    {
        FNameTB.Text = "";
        QueryDD.Text = "";
        EmailTB.Text = "";
        TelephoneTB.Text = "";
        CommentsTB.Text = "";
    }

    }

ASPX:

<asp:PlaceHolder ID="formPH" runat="server" Visible="true"> 
<form id="form1" runat="server">
<table id="contact" cellspacing="7">
<tr>
<td class="label"></td>
<td><asp:TextBox ID="FNameTB" runat="server" width="350px" title="Your Name" />
<asp:RequiredFieldValidator ID="rfvFName" runat="server" ControlToValidate="FNameTB" ErrorMessage="First Name is required" Display="Dynamic" />
</td>
</tr>
<tr>
<td class="label"></td>
<td><asp:TextBox ID="EmailTB" runat="server" width="350px" title="Your Email" />
<asp:RequiredFieldValidator ID="rfvEmail" runat="server" ControlToValidate="EmailTB" ErrorMessage="Email is required" Display="Dynamic" />
</td>
</tr>
<tr>
<td class="label"></td>
<td><asp:TextBox ID="TelephoneTB" runat="server" width="350px" title="Your Telephone Number" />
<asp:RequiredFieldValidator ID="rfvTelephone" runat="server" ControlToValidate="TelephoneTB" ErrorMessage="Telephone number is required" Display="Dynamic" />
</td>
</tr>
<tr>
<td class="label"></td>
<td><asp:DropDownList ID="QueryDD" runat="server" width="355px" CssClass="QueryDD">
        <asp:ListItem Selected="True" style="color: #999999">Select a Service</asp:ListItem>
        <asp:ListItem>test</asp:ListItem>
        <asp:ListItem>Cleaning</asp:ListItem>
        <asp:ListItem>test</asp:ListItem>
        <asp:ListItem>Bar</asp:ListItem>
        <asp:ListItem>Cleaning</asp:ListItem>
        <asp:ListItem>Cleaning</asp:ListItem>
        <asp:ListItem>Wash Cleaning</asp:ListItem>
        <asp:ListItem>Cleaning</asp:ListItem>
        <asp:ListItem>Supplies</asp:ListItem>
   </asp:DropDownList>
<asp:RequiredFieldValidator ID="rfvLName" runat="server" ControlToValidate="QueryDD" ErrorMessage="Query is required"  Display="Dynamic" />
</td>
</tr>
<tr>

<tr>
<td class="label"></td>
<td><asp:TextBox ID="CommentsTB" title="Comments" runat="server" TextMode="MultiLine" width="350px" />
<asp:RequiredFieldValidator ID="rfvComments" runat="server" ControlToValidate="CommentsTB" ErrorMessage="Comments are required" Display="Dynamic" />
</td>
</tr>
<tr>
<td></td>
<td><asp:Label ID="lblCaptchaCode" runat="server" Text=""></asp:Label><asp:Image ID="imCaptcha" ImageUrl="captcha.ashx" runat="server" width="120px" /> <asp:Button ID="btnNewCode" runat=server Text="GENERATE"></asp:Button></td>
</tr>
<tr>
<td class="label"></td>
<td><asp:TextBox ID="txtVerify" runat="server" width="350px" title="Enter the above code here"> </asp:TextBox>
<asp:RequiredFieldValidator ID="rfvCaptcha" runat="server" ControlToValidate="txtVerify" ErrorMessage="Required" Display="Dynamic" />
</td>
</tr>
<tr>
<td></td>
<td class = "buttons" colspan="2"><asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSave_Click"/><asp:Button ID="btnReset" runat="server" Text="Reset" OnClick="Reset"/></td>
</tr>
<tr>
<td></td>
<td><asp:PlaceHolder ID="sucessPH" runat="server" Visible="false"><p class="submission">Thank you for your submission.</p></asp:PlaceHolder></td>
</tr>
<tr>
<td></td>
<td><asp:CustomValidator ID="CustomValidator2" runat="server" ControlToValidate="txtVerify" ErrorMessage="Wrong verification code, please refresh the page"
            OnServerValidate="CAPTCHAValidate"></asp:CustomValidator></td>
</tr>
</table>


</form>
</asp:PlaceHolder> 

I need to be able to store the captcha in a label and create a button that reloads just the captcha..

Any ideas?

I've came this far, just need some help please. EDIT: added the aspx code.

PD24
  • 714
  • 5
  • 16
  • 36
  • i added the aspx page, can you help me? – PD24 Sep 08 '11 at 14:00
  • I can't see any major issue in your code which should prevent a refresh. Are you sure your browser is not caching the image? If so, the generic handler would not be called and you get the same image again, even though you have a new value in the Session. Check if your browser really loads the picture (with Firebug for example) – magnattic Sep 08 '11 at 14:35
  • its only IE 9 that has the issue, chrome and FF work fine... :S – PD24 Sep 08 '11 at 14:39

1 Answers1

1

It seems like you have a caching problem. The browser does not know that the image has changed and therefore uses an earlier stored version.

If you don't want to disable caching completely, you can circumvent this behaviour by adding a dummy value (for example the current timestamp) to the image path. The browser will reload the image then everytime, because it has a new url.

http://localhost/captcha.ashx?d=1315497031

EDIT: To do this just add this line in your Page_Load:

imCaptcha.ImageUrl = "captcha.ashx?d=" + DateTime.Now.Ticks;
Community
  • 1
  • 1
magnattic
  • 11,529
  • 10
  • 59
  • 109
  • how would i stopthe caching, sorry i dont understand. – PD24 Sep 08 '11 at 14:54
  • As I explained above, just add a new number to the handler path everytime you display the page, and the browser should not store the image. See my edit for how to do this. – magnattic Sep 08 '11 at 15:04
  • String dummy = math.rand() imCaptcha.ImageUrl = "captcha.ashx"; – PD24 Sep 08 '11 at 15:05
  • 1
    i added the code above. if it works for you, please mark this answer as accepted. if it still wont work, you maybe should post your captcha.ashx code. – magnattic Sep 08 '11 at 15:06
  • Such a clever way to work round the problem of caching! thank you so much! – PD24 Sep 09 '11 at 09:50