0

单击 时LinkButton,我在图像控件中刷新图像而不刷新页面。为此,我使用了UpdatePaneland 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)
4

1 回答 1

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();

如果从加载到加载的验证码相同,则可以将其保留在缓存中。

现在,“正确的方法”是使用处理程序而不是页面,原​​因有很多,比如您不希望页面的所有开销都只是发送图像。现在处理程序带有最小模块调用添加会话需要使用IRequiresSessionState.

要回答这个问题,为什么在浏览器上的行为不同,是因为在一些小细节中浏览器有不同的行为,取决于他们检查的方式和内容以决定使用缓存的图像,以及浏览器缓存的激进程度.

于 2013-05-13T16:26:36.753 回答