【问题标题】:Captcha Refresh issue?验证码刷新问题?
【发布时间】:2011-11-12 23:53:02
【问题描述】:

您好,我的验证码有问题,当用户输入错误的代码时,它不想刷新。

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 代码。

【问题讨论】:

  • 我添加了aspx页面,你能帮帮我吗?
  • 我在您的代码中看不到任何应该阻止刷新的重大问题。您确定您的浏览器没有缓存图像吗?如果是这样,则不会调用通用处理程序并且您会再次获得相同的图像,即使您在 Session 中有一个新值。检查您的浏览器是否真的加载了图片(例如使用 Firebug)
  • 它唯一有问题的 IE 9,chrome 和 FF 工作正常...:S

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


【解决方案1】:

您似乎遇到了缓存问题。浏览器不知道图像已更改,因此使用较早的存储版本。

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

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

编辑: 为此,只需在您的 Page_Load 中添加这一行:

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

【讨论】:

  • 如何停止缓存,抱歉我不明白。
  • 正如我上面解释的那样,每次显示页面时只需在处理程序路径中添加一个新数字,浏览器不应该存储图像。请参阅我的编辑以了解如何执行此操作。
  • String dummy = math.rand() imCaptcha.ImageUrl = "captcha.ashx";
  • 我添加了上面的代码。如果它适合您,请将此答案标记为已接受。如果它仍然不起作用,您也许应该发布您的 captcha.ashx 代码。
  • 解决缓存问题的巧妙方法!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2016-01-22
  • 1970-01-01
  • 2020-05-01
  • 2012-04-26
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多