【问题标题】:ImageURL doesn't work inside Update PanelImageURL 在更新面板中不起作用
【发布时间】:2011-11-07 17:51:42
【问题描述】:

我正在用 ASP.NET C# 编写一个验证码验证程序。我面临的问题是在回发期间输入错误值时图像会刷新;但是当我将它们保留在更新面板中时,在部分回发期间不会刷新相同的图像。

aspx 来源

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>            
            <asp:Image ID="ImageCaptcha" runat="server" ImageUrl="~/BringImg.aspx" /><br />
            <asp:TextBox ID="txtCaptcha" runat="server" ></asp:TextBox><br />                        
            <asp:Button ID="btnSubmit" runat="server" Text="Submit Project"  OnClick="btnSubmit_Click"/>
            </ContentTemplate>
</asp:UpdatePanel>

代码隐藏:

private System.Random rand = new System.Random();
protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            this.Session["Captcha"] = GenerateRandomCode();
        }
    }
protected void btnSubmit_Click(object sender, EventArgs e)
    {
        string temp = this.Session["Captcha"].ToString();
        if (string.Compare(temp, this.txtCaptcha.Text.Trim()) == 0)
        {            
            // success logic
        }
        else
        {                     
            this.lblResult.Text = "Validation Text was not correct.";
            this.Session["Captcha"] = GenerateRandomCode();
            ImageCaptcha.ImageUrl = "~/BringImg.aspx";
            ImageCaptcha.DataBind();
        }
    }

【问题讨论】:

  • 坦率地说,如果你可以避免它,我会建议不要使用 ASP.NET AJAX 并改用 real AJAX。
  • 您是否发送任何无缓存标头? Internet Explorer 是否设置为自动获取新版本的页面?如果是这样,将其设置为“工具-选项”下的“每次访问网页”,“浏览历史记录->设置”
  • 我建议您设置 ajax nocache 选项,即:$.ajaxSetup({cache: false}});

标签: c# asp.net ajax updatepanel captcha


【解决方案1】:

我猜您的 ~/BringImg.aspx 页面将其内容类型设置为图像并根据该会话值生成您的验证码图像。图像可能在部分回发期间没有更新,因为浏览器没有意识到图像内容已更改。有几种方法可以让浏览器知道图像已更改,但最容易测试的方法之一是将无意义的查询字符串(每个图像不同)应用于验证码的 ImageUrl。

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string temp = this.Session["Captcha"].ToString();
    if (string.Compare(temp, this.txtCaptcha.Text.Trim()) == 0)
    {            
        // success logic
    }
    else
    {                     
        this.lblResult.Text = "Validation Text was not correct.";
        this.Session["Captcha"] = GenerateRandomCode();
        ImageCaptcha.ImageUrl = string.Format("~/BringImg.aspx?refresh={0}", Guid.NewGuid());
        ImageCaptcha.DataBind(); //This isn't necessary
    }
}

【讨论】:

    【解决方案2】:

    尝试将更新面板更新模式设置为“有条件” 并在绑定验证码后更新更新面板。

    UpdatePanel1.Update();
    

    希望这可能有效。

    【讨论】:

      【解决方案3】:

      我完全同意@Aren 的上述评论。我已经使用更新面板 4 年了,有时看到它做所有奇怪的事情。使用 Jquery ajax 而不是你可以透明地看到发生了什么,而且 IMO 也确实更快。

      这听起来像是一个缓存问题。确保最终图像对 url 具有随机值。这样它就不会使用图像的缓存版本。使用 firebug 在 Net 面板中查看 GET 请求,看看它是否正在下载最新的图像。

      不确定这一行是什么意思。执行后 imageurl 会被设置成什么。

      ImageCaptcha.ImageUrl = "~/BringImg.aspx";
      

      【讨论】:

      • 我在 UpdatePanels 上工作了一段时间,觉得它们比它们的价值更麻烦。你必须做太多的工作才能让某些东西按你的意愿工作。
      • @Sonesh 这可能是一个缓存问题,因为验证码内容已更改(通过代码检查)但图像未相应更改。即,即使我输入了验证码中显示的正确内容,它也会显示错误的值。如果我应用完整的回发,则该值会更改。如何检索更新面板内的图像?
      【解决方案4】:

      有什么理由不使用recaptcha? 我保证它是一个更好的解决方案并且它是免费的。 http://www.google.com/recaptcha/whyrecaptcha

      您上面的代码在会话中使用了两个不同的值 - 这是故意的还是您的问题的根源?:

      Captcha 和 CaptchaImageTest

      【讨论】:

      • 这是一个错字。会话变量是相同的,即 Captcha
      • 当用户输入错误的验证码值并获得另一个机会时,我不希望页面执行回发。我希望回发仅在用户输入正确的验证码值后发生。这可以通过 recaptcha 来实现吗?
      • 您是否排除了缓存问题?使用提琴手并检查返回的数据。它是否包含新的图像标签?
      • 你现在不这样做吗?无论哪种方式,您都在进行回发。
      • 不,我正在做部分回发而不是完整回发。
      猜你喜欢
      • 2014-07-30
      • 2017-01-31
      • 2010-10-13
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多