【问题标题】:UpdatePanel working only on Chrome and not in IE / Mozilla. Why?UpdatePanel 仅适用于 Chrome,不适用于 IE / Mozilla。为什么?
【发布时间】:2013-05-13 13:31:36
【问题描述】:

单击LinkButton 时,我在图像控件中刷新图像而不刷新页面。为此,我使用了UpdatePanel 和AsyncPostBackTrigger。

它在 chrome 中完美运行。但不是在 IE 和 Mozilla 中。在 IE 和 Mozilla 上,当我单击链接按钮时,什么都没有发生。看起来很奇怪。对此有任何线索吗?

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:TextBox ID="txtCaptchaInput" BorderStyle="Solid" Style="vertical-align: top" runat="server" Width="106px" BorderWidth="1px"></asp:TextBox>
        <asp:Image ID="img_captcha" runat="server" Height="32px" ImageUrl="~/captchaJPEG.aspx" Width="108px" /> 
        <asp:LinkButton ID="captcha_refresh" runat="server">Refresh Image</asp:LinkButton>
    </ContentTemplate> 
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="captcha_refresh"  />
    </Triggers>
</asp:UpdatePanel>

CaptchaJPEG.aspx:页面加载

    Dim captcha As New Captcha.CaptchaImage()
    captcha.width = 150 
    captcha.height = 40 
    captcha.text = Me.Session("CaptchaText").ToString()
    captcha.GenerateImage() 
    captcha.image.Save(Me.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg)

【问题讨论】:

  • 检查你得到的 javascript 错误!链接按钮也没有调用任何功能!也许这就是问题所在?
  • @Aristos Mozilla 中没有 javascript 错误。并且链接按钮有一个单击事件,当单击 Mozilla 和 Chrome 中的链接按钮时,该事件会正确触发。问题是图像在除 mozilla 以外的浏览器中没有变化
  • 那么图像可能会保留在缓存中,需要采取一些技巧来强制更新。现在我看得更清楚了,您可以使用页面发送图像。最好使用处理程序。
  • @Aristos 好的,我创建了一个 .Ashx 文件,我可以看到“Public Sub ProcessRequest(ByVal context As HttpContext)”但是我在 .Aspx 页面中生成图像的代码在页面加载中。我该把代码放在这个文件的什么地方?
  • 你把它放在ProcessRequest上,同时设置缓存头

标签: asp.net .net vb.net asp.net-ajax updatepanel


【解决方案1】:

您的问题与返回图像的 captchaJPEG.aspx 的缓存有关。作为图像浏览器可以保留它而不改变它。

为了避免你有两种方法,你可以设置一些缓存头告诉浏览器不要把它放在缓存中:

Response.Cache.SetExpires(DateTime.Now.AddDays(-10));
Response.Cache.SetMaxAge(new TimeSpan(-10, 0, 0));

或者-我认为更好-在图像标签上添加一个随机数,就像您在后面的代码中设置它一样:

img_captcha.ImageUrl = "~/captchaJPEG.aspx?_rnd=" + RandomNumber;

在这里你可以做得更好,使用验证码的hash(),如:

img_captcha.ImageUrl = "~/captchaJPEG.aspx?_rnd=" + CaptachHiddenNumbers.hash();

如果每次加载的验证码相同,您可以将其保存在缓存中。

现在,“正确的方法”是使用处理程序而不是页面,原​​因有很多,比如您不希望页面的所有开销都只是发送图像。现在the handler come with the minimum modules call,转为add session you need to use the IRequiresSessionState。

要回答这个问题,为什么在浏览器上表现不同,是因为在一些小细节中浏览器有不同的行为,取决于他们检查的方式和内容以决定使用缓存的图像以及浏览器的攻击性如何与缓存。

【讨论】:

  • @majidgeek 我不知道 - 我需要做一个测试,看看它是否是。关于问题的cmets声称它是。 (请参阅关于 OP 的第一条评论)并且因为在一个浏览器上工作,所以也许不是这就是问题,如果可以肯定的话,缓存。
  • @Aristos 我已经添加了缓存到期,正如您在“captchajpeg.aspx”页面加载的第一点中提到的那样,但即使这样也不起作用。我做错了吗?
  • @Anuya 也许验证码有问题并保持相同的代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多