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

时间:2010-04-03 10:36:36

标签: asp.net firefox google-chrome updatepanel timer

到目前为止对这个问题有点困惑,我希望你们中的一些大师可以解释我的问题......

我开发了一个增强AJAX的网站,该网站在IE,Chrome和Firefox上已经运行了一年左右。我使用Timer-control每隔30秒检查一次传入消息,这会更新UpdatePanel,显示潜在的新消息。

现在我的几个Firefox用户抱怨每30秒刷新一次页面!我自己无法重现这种行为,但鉴于“30秒”的描述,我诅咒我的Timer-solution作为罪魁祸首。

但是现在,我自己也遇到了这个错误,但不是在Firefox中,而是在Google Chrome中! (并且仅在我的两台计算机中的一台!)每30秒页面重新加载!但我发现它不仅与Timer有关,因为 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>

在网站的其他地方,我直接从JavaScript调用客户端__doPostBack函数与UpdatePanel相关。此调用的正常行为是使用某些内容更新引用的UpdatePanel,但现在在Chrome中刷新整个页面! (但不一致,从不在IE中)

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

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

只是为了折磨我,我只在我的公共网站上体验过这种情况,而不是在我当地的开发环境中,这让我找到了真正的原因让我感到乏味! :(

有关为何会发生这种情况的任何想法?为什么这么不一致?与我的UpdatePanel设计有关吗?或者Firefox / Chrome中的某些安全设置会阻止某些异步UpdatePanel回调吗?

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

1 个答案:

答案 0 :(得分:2)

行。我修好了它。对于未来的任何头发堵塞读者来说,这是我经历过的:

我阅读了TenaciousImpy建议的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中重现错误,这意味着每个帖子都会刷新整个页面...... :(

然后通过纯粹的机会(并且不是经常偶然我们注意到最烦人的错误的原因吗?)我注意到我的授权逻辑被调用在一个帖子上,而不是假设做任何事情像那样。是的!...最后一条线索应该可以帮我找到脱发的原因。

在这里追逐,它显示,谷歌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);
}

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

当设置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中的登录偏好内存。