代码之家  ›  专栏  ›  技术社区  ›  Alex browe

为什么在使用异步UpdatePanel回发时,我的整个页面会重新加载到Chrome和Firefox中?

  •  1
  • Alex browe  · 技术社区  · 16 年前

    现在我对这个问题有点困惑,我希望你们中的一些大师能对我的问题有所启发…

    我开发了一个ajax增强的网站,在ie、chrome和firefox上运行了一年左右。我使用计时器控件每隔30秒检查一次传入的消息,这会更新一个显示潜在新消息的updatepanel。

    现在我的几个火狐用户抱怨页面每30秒刷新一次!我自己无法再现这种行为,但鉴于“30秒”的描述,我诅咒我的计时器解决方案是罪魁祸首。

    但现在,我自己也遇到了这个错误,虽然不是在火狐,而是在谷歌浏览器!(而且只有我的两台电脑中的一台!)每30秒页面重新加载一次!但我发现它不仅和计时器有关,因为 UpdatePanels中所有其他异步回发到服务器的操作也会重新加载整个页面。

    据我所知,在Internet Explorer中从未遇到过此错误。

    如我所说,这不仅与计时器回发有关,而且如果任何人感兴趣,代码如下:

    <asp:Timer runat="server" ID="MailCheckTimer" Interval="30000" OnTick="MailChecker_Tick"></asp:Timer>
    
    <asp:UpdatePanel runat="server" ID="MailCheckerUpdatePanel" UpdateMode="Conditional">
        <ContentTemplate>
             <div class="newmail_box" runat="server" id="newmail_box">
               <!-- Content stripped for this example -->
             </div>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="MailCheckTimer" />
        </Triggers>
    </asp:UpdatePanel>
    

    在网站的其他地方,我称之为客户端 __doPostBack 直接从javascript执行与updatepanel相关的函数。这个调用的正常行为是用一些内容更新被引用的updatepanel,但是现在在chrome中,它刷新了整个页面!(但同样不一致,在ie中也没有)

    即使是最基本的updatePanel操作(如单击按钮(在面板内)后刷新内容),也会强制页面完全重新加载:

    <asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click"></asp:Button>
    

    为了进一步折磨我,我只在我的公共网站上,而不是在我的本地开发环境中体验到了这一点,这让我找不到真正的原因成为一件乏味的事情!:(

    你知道为什么会这样吗?为什么这么不一致?与我的UpdatePanel设计有关吗?或者firefox/chrome中的一些安全设置阻止了一些异步updatepanel回调?

    任何帮助或想法都非常感谢!

    1 回复  |  直到 16 年前
        1
  •  2
  •   Alex browe    16 年前

    好啊。我把它修好了。对于任何未来的读者来说,这都是值得的,以下是我所经历的:

    我在 http://blogs.visoftinc.com/archive/2007/09/23/asp.net-ajax-updatepanel-not-working-common-problems.aspx 固执的暗示。虽然看起来很有趣,但我尝试将xhtmlconformance属性设置为transistional,没有任何效果。我还尝试使用validator.w3.org上的优秀xhtml验证服务验证我的内容,尽管让我的html恢复正常感觉很好,但它并没有解决我的问题。我仍然可以在chrome中重现这个错误,这意味着每次回发都会刷新整个页面……:(

    然后纯属偶然(难道我们不是经常偶然发现最令人恼火的虫子的原因吗?)我注意到我的授权逻辑是在一个post back上调用的,而这个post back不应该这样做。对!…最后一个线索,应该能很快帮助我找到我脱发的原因。

    切到这里,它表明, 当google chrome和firefox设置为记住某个特定网站的登录信息时,将这些信息与每个帖子一起发送回来 . 我通常会将这些发送到服务器,并按如下方式检查它们:

    string usern = Request["loginusername"] as string;
    string password = Request["loginpassword"] as string;
    
    if (!String.IsNullOrEmpty(usern) && !String.IsNullOrEmpty(password))
    {
            Authenticate(usern, password, Request["rememberme"] != null);
    }
    

    嗯,我在母版页面的早期检查了这些参数,如果它们存在,我假设用户提交了登录请求。我对用户进行了身份验证,为了便于编程,我将同一页面重定向到用户(即以登录格式刷新页面并删除登录控件)。

    当设置chrome或firefox来记住您的最新登录名和密码时,每30秒打一个勾号的我的计时器的回调参数会随着用户的登录偏好而扩展。

    解决办法此后简单明了。我现在只为匿名用户调用身份验证逻辑:

    if ( Session["user"] == null ) // Check parameter indicating a logged in user
    {
          string usern = Request["loginusername"] as string;
          string password = Request["loginpassword"] as string;
    
          if (!String.IsNullOrEmpty(usern) && !String.IsNullOrEmpty(password))
          {
             Authenticate(usern, password);
          }
    }
    

    这允许我的站点支持chrome和firefox中的登录首选项内存。