UpdatePanel仅适用于Chrome,而不适用于IE / Mozilla。为什么?

时间:2013-05-13 13:31:36

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

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

它在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)

1 个答案:

答案 0 :(得分:0)

您的问题与返回图片的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 calladd session you need to use the IRequiresSessionState

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