【问题标题】:Page_Load not being called on re-navigation重新导航时未调用 Page_Load
【发布时间】:2010-11-09 11:02:51
【问题描述】:

我遇到了一个奇怪的问题。这是场景

这是我的文件:

  1. Project1.aspx
  2. Project2.aspx

它们的设置完全相同,包括它们的 Page_Load 函数:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

If (Not Page.IsPostBack) Then

   setPrevIndex(-1)

   ...

   End If


End Sub

它们都是这样设置的。

这是我遇到问题的地方。当我导航到这些页面中的任何一个时,我需要确保 prevIndex 设置为 -1(通过函数)。

  • 对于 Project1.aspx,当我导航时 到页面,Page_Load 触发。
  • 对于 Project1.aspx,当我刷新页面时,Page_Load 会触发。
  • 对于 Project1.aspx,当我在浏览器导航栏中按“Go”并返回当前页面时,Page_Load 会触发。

  • 对于 Project2.aspx,当我导航时 到页面,Page_Load 触发。
  • 对于 Project2.aspx 当我刷新时 页面,Page_Load 触发。
  • 对于 Project2.aspx 当我按下 我的浏览器导航栏中的“Go”, 回到当前页面, Page_Load 根本没有触发! 该功能甚至没有 调用。

任何想法为什么?这是什么原因造成的?

请要求澄清。

更新:

当我在指向同一个 URL 的 URL 中按“Go”时,似乎只有母版页会重新加载,但 Load_Page 事件甚至不会触发......

还有其他建议吗?

谢谢, E

【问题讨论】:

  • 没有。我不知道它可能是什么
  • 只是需要检查一下 - 您使用的是什么浏览器?其他浏览器是否也会出现同样的问题?

标签: asp.net pageload


【解决方案1】:

尝试禁用输出缓存,看看问题是否仍然存在:

<system.web>
  <caching>
    <outputCache enableOutputCache="false"/>
  </caching>
<system.web>

【讨论】:

【解决方案2】:

使用LiveHTTPHeadersFiddler 确保每次实际请求页面的方式都相同。这可能是缓存的问题。

【讨论】:

    【解决方案3】:

    在本地加载您的网站并转到http://yourwebsite/trace.axd

    这会显示每个页面的服务器跟踪以及服务器状态。它还显示了完整的页面生命周期和时间。

    清除当前跟踪,然后重复您的 3 次访问并重新加载每个到 Project1.aspx 和 Project2.aspx

    trace.axd 现在显示什么?您应该有 6 个条目,每个条目的状态码为 200 和动词 GET。

    如果你有更少,那么你的问题是某种缓存。

    如果您有 6 个,请检查最后一个的详细信息 - 页面事件生命周期显示什么?它还将显示完整的 WebForm 控件层次结构,因此如果这与母版页相关,您将能够分辨出来。

    【讨论】:

      【解决方案4】:

      尝试在页面初始化事件中将 previndex 设置为 -1。我不确定为什么会这样。

      【讨论】:

        【解决方案5】:

        各种与缓存相关的事情可能会导致请求无法发出,尤其是当您仅按“开始”按钮时,因此您应该检查您的缓存头。

        如果缓存是问题,您可以执行以下操作:

        //ask browser to revalidate:
        context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
        //and hint that the page is outdated anyhow...
        context.Response.Cache.SetMaxAge(TimeSpan.Zero);
        

        这应该能说服浏览器在每次网页浏览时真正获得一个新版本。例如,您可以在 Page_Load 本身中设置这些变量;-)。如果您不使用 https,那么以下内容也是无风险的:

        //prevents plugin based file-open in IE+https, otherwise fine:
        context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        context.Response.Cache.SetNoStore();
        

        我敢打赌这会解决它 - 如果没有,我第二次 Jeremy Steins 建议你使用 fiddler 来验证请求是否真的被提出(并且因为你是一个网络开发者,所以得到 fiddler无论如何,它是一个方便的工具,适用于所有浏览器!)。

        最后 - 你能知道当你点击 go 时页面上是否有任何 other 代码运行吗? (即整个页面没有运行,或者只是 Page_Load - 后者会提示事件连接错误,考虑到您的负载处理程序有时会触发,这会很奇怪)。

        【讨论】:

          【解决方案6】:

          听起来您的页面已被缓存。这将导致 Page_Load 不触发。检查您是否没有在任何地方设置它。

          【讨论】:

            【解决方案7】:

            您是否尝试过将应用程序发布到另一台机器上?可能是 IIS 在做某事,所以请先尝试消除它。假设您的代码在两者中都是相同的,只是页面名称不同(对 aspx 和 .cs 文件进行差异验证)然后将您的应用程序移动到不同的服务器并重新测试。

            如果它仍然发生,那么它确实必须是您的浏览器在缓存方面做了一些事情。

            【讨论】:

              【解决方案8】:

              尝试在您的服务器上使用精简的功能重新创建场景。如果问题仍然存在,请尝试使用一些缓存计数器方法。如果不是,那意味着它必须是您的代码。

              【讨论】:

                【解决方案9】:

                如果您的页面(或母版页)顶部有此(或类似内容),这将导致它:

                <%@ OutputCache Duration="3600" VaryByParam="none" %>
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-11-11
                  • 2016-03-31
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多