验证码刷新问题?

时间:2011-09-08 13:08:40

标签: c# asp.net captcha contact-form

嗨,我的验证码有问题,当用户得到错误代码时,它不想刷新。

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> 

我需要能够将验证码存储在标签中并创建一个只重新加载验证码的按钮。

有什么想法吗?

我已经走到这一步了,请给我一些帮助。 编辑:添加了aspx代码。

1 个答案:

答案 0 :(得分:1)

好像你有一个缓存问题。浏览器不知道图像已更改,因此使用较早存储的版本。

如果您不想完全禁用缓存,则可以通过adding a dummy value(例如当前时间戳)避开图像路径的此行为。浏览器每次都会重新加载图像,因为它有一个新的URL。

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

编辑:为此,只需在Page_Load中添加以下内容:

imCaptcha.ImageUrl = "captcha.ashx?d=" + DateTime.Now.Ticks;