Page_Load 在 ASP.NET 页面中触发了两次

Posted

技术标签:

【中文标题】Page_Load 在 ASP.NET 页面中触发了两次【英文标题】:Page_Load is firing twice in ASP.NET page 【发布时间】:2011-06-14 17:21:55 【问题描述】:

Asp.net page_load 函数加载了两次。因此它会影响我的页面性能。 有谁知道它加载两次的原因。

不,我没有在任何地方调用页面加载函数...

【问题讨论】:

一个代码示例会很好...您是否想过在某个地方可能会出现两次 AJAX 调用到您的页面的事实。或者,也许您正在无限循环中重定向? 请提供任何有助于我们发现问题的代码。另外,它可能是页面代码中某处的 __doPostBack 调用。 嗨,bob 和 Doug,谢谢您的回复.. 我检查了.. 我的代码中没有 AJAX 调用和 doPostBack 调用.. 你们知道页面可以通过多少种方式回发两次.. 它的插槽很长。 ***.com/questions/2009092/… 【参考方案1】:

不是你两次调用页面加载函数,这就是 ASP.NET 的工作方式。当页面上的任何服务器控件被触发(设置为回发的那些)时,页面将发布到自身,从而调用 page_load 函数。

您需要做的是进行一些检查以区分初始页面加载和回发

if(!IsPostBack) 
  
//Code when initial loading 

 else 
 
// code when post back 

【讨论】:

哇,我记得 10 年前的这个! IsPostback 不是答案。从外部站点重定向似乎会导致两个不是回发的负载。花了一天时间在这上面发疯。最终补偿了下游。 救生员,谢谢朱利叶斯。这意味着第一个 Page_Load 初始化内容,第二个 Page_Load 执行 (IsPostBack) 块中的任何代码,然后是任何事件处理程序。【参考方案2】:

请尝试进行此链接中提到的更改。 http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/ccc75925-3460-497c-8471-fcebecd8d061

顺便说一句,我用谷歌搜索了Page_Load Being called twice

【讨论】:

【参考方案3】:

请在此处找到解决方案........

    检查 Load 事件是否有基类和子类的处理程序 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 处理 MyBase.Load、Me.Load**

    如果只是从事件中删除 Me.Load,现在检查您的页面。希望这可能有用并解决您的问题。

【讨论】:

【参考方案4】:

刚刚遇到这个问题,并认为我会发布一个总结我发现的答案以及我的实际问题的答案。

1. img tags with src="" or Image tags with ImageUrl=""
2. Using AutoEventWireup="true" and adding a page handler
3. Having manually added the event handler (more common for C# than VB)
4. Handling both MyBase.Load and Me.Load
5. Variation on the missing img src, body  background-image: url(); 
6. Rewrite rule and missing favicon.ico 

最后是我的问题....

我的页面继承自包含页面加载处理程序的类,该类继承自具有页面加载处理程序的类。

Public Class C1
    Inherits System.Web.UI.Page
   Protected Overridable Sub PageLoad(ByVal sender As Object, 
                               ByVal e As System.EventArgs) Handles Me.Load
   End Sub
End Class

Public Class C2
    Inherits C1
    Protected Overrides Sub PageLoad(ByVal sender As Object, 
                      ByVal e As System.EventArgs) Handles Me.Load
        MyBase.PageLoad(sender, e)
    End Sub
End Class

Public Class MyPage 
    Inherits C2
    Protected Overrides Sub PageLoad(ByVal sender As Object, 
                      ByVal e As System.EventArgs) 
        MyBase.PageLoad(sender, e)
    End Sub
End Class

我对此进行了测试,如果你在 MyPage 中的方法上放置 Handles,它会被命中 3 次...

【讨论】:

我在母版页中将 AutoEventWireUp 设置为 false,这对我有帮助。删除它没有。 这正是我的问题。继承自基类。我从子类中删除了句柄类,它反复停止触发。 我的问题是所有这些以及更多。一旦我清理了代码,将页面和母版切换到 AutoEventWireup="true",并删除了母版和页面中的所有页面加载事件处理程序,然后我不得不将我的母版的命名空间更改为与项目。 forums.asp.net/post/5052415.aspx ,对我来说 img 标签 src="#" 导致 page_load 被触发了两次【参考方案5】:

我通过将 AutoEventWireUp 属性设置为 FALSE 解决了我的问题。我从 .net 1.1 迁移到 .net 4.0 时遇到了这个问题。当我从旧版本复制文件时,VS2012 以某种方式将此属性重置为 TRUE。

【讨论】:

我遇到的问题是,当我将 AutoEventWriteUp 设置为 FALSE 时,page_load 事件现在根本不会触发。【参考方案6】:

我有同样的问题。 这是因为带有 ImageUrl="" 的 TreeNode。

【讨论】:

【参考方案7】:

一旦我在一个项目中找到以下字符串:

  <link rel="Shortcut Icon" href="#" type="image/x-icon" />

有人只是像他通常对“a href”所做的那样做。 但浏览器实际上会在每次刷新时尝试获取站点图标,因此它会从 href 参数向地址发送请求,即发送到同一页面。

所以,也检查一下。

【讨论】:

使用 标签经历了同样的事情。棘手的部分是额外的请求(对同一页面的 GET)没有显示在 Chrome 开发工具中。不知道为什么或如何可能。顺便说一句:我首先有一个“#” src'd 图像的唯一原因是因为 IE8 在操作 的 DOM 时给我带来了问题。 我有同样的事情,但我有一个“有效”的 src 值。我没有添加前面的“/”。 src 值为“resources/images/button.png”,一旦更改为“/resources/images/button.png”,只有一个page_load。如果有人可以解释原因,我会非常感兴趣。谢谢 【参考方案8】:

对我来说,我可以通过使用 PreRender 事件来多次绕过这个调用

protected override void OnPreRender(EventArgs e)

这只会被调用一次,即使 onload 和 init 被调用了一百万次。

【讨论】:

【参考方案9】:

我用Server.Transfer 替换了Response.Redirect,因为它被认为是新的做事方式。从那时起,页面加载了两次,Chrome 中的后退按钮返回到上一页并立即返回到当前页面。我用Response.Redirect 替换了Server.Transfer,一切恢复正常。 我也把这个答案放在page loads twice due to js code。

【讨论】:

Response.Redirect 和 Server.Transfer 有不同的用途,不能 100% 互换。是什么让您认为在所有情况下都适合将重定向更改为转移?【参考方案10】:

对我来说,这是一个空白图像标签。

      <img src="#" />

【讨论】:

【参考方案11】:

记得检查 IsPostBack 的值,如下所示:

    protected void Page_Load(object sender, EventArgs e)
    
            if (!this.IsPostBack)

您可以在此 IF 块内放置断点以验证您是否运行了两次 Page_Load。 如果您看到 Page_Load 运行两次并且每次都不是回发,请检查此页面的 OnInit() 方法。 验证您没有像下面那样连接负载处理程序。您会经常从从早期版本的 Visual Studio 迁移的代码中看到此代码。

        this.Load += new System.EventHandler(this.Page_Load);

如果您发现它,请将其删除。这假设您在页面标记的顶部有以下内容。 AutoEventWireup="true"

【讨论】:

【参考方案12】:

我遇到了同样的问题并解决了。

我检查了我的 Global.ascx 和我的重写规则。

当请求页面时,URL 的末尾没有“/”,根据我的 SEO 标准配置,发生了从“x.com/x”到“x.com/x/”的重定向。

所以一切都很好,你的内部链接应该在 URL 的末尾有“/”以避免多次加载。

【讨论】:

【参考方案13】:

Page 对象调用 Page 对象上的 OnLoad 方法,然后递归地对每个子控件执行相同的操作,直到加载页面和所有控件。各个控件的 Load 事件发生在页面的加载事件。

使用 OnLoad 事件方法在控件中设置属性并建立数据库连接。

参考 MSDN:enter link description here

【讨论】:

【参考方案14】:

对我来说,这是通过删除解决的

Handles Me.Load 

并改变方法,如

Protected Overrides OnLoad(...)

【讨论】:

【参考方案15】:

对我来说,这个问题是在 2017 年 10 月的 Windows 更新之后突然出现的。我注意到对于匿名用户可以通过 web.config 中的 Location 元素访问的页面,现在还需要授予对该页面引用的任何资产的访问权限,例如图像、样式表等。下面的示例授予匿名访问权限登录页面和“图像”目录(又名文件夹):

<location path="login.aspx">
  <system.web>
    <authorization>
      <allow users="?" />
    </authorization>
  </system.web>
</location>
<location path="images">
  <system.web>
    <authorization>
      <allow users="?" />
    </authorization>
  </system.web>
</location>

更新:我发现 Page_Load 被调用两次的第二个原因。在旧的遗留代码中,某些页面的 .aspx.designer.cs 文件包含的不一致显然直到现在才引起问题。我没有尝试修复,而是创建了新页面,从而消除了双重加载事件。

【讨论】:

【参考方案16】:

我有同样的问题。我将AutoEventWireup 设置为false,然后从InitializeComponent() 中删除Page.Load += new EventHandler(Page_Load);。现在它正在工作...... 我想因为System.Web.UI.Page中的[DefaultEvent("Load")],所以默认事件是Load所以你不需要在你的页面类初始化时再次添加它。

【讨论】:

以上是关于Page_Load 在 ASP.NET 页面中触发了两次的主要内容,如果未能解决你的问题,请参考以下文章

急切求助ASP.NET中的UPDATE数据库记录问题!

Page_Load()被多次调用(对于页面中使用的每个JS文件一次)和Page.IspostBack为FALSE

如何获取触发到断点的 ASP.NET 事件列表?

ASP.Net:在 Page_Load 中调用异步方法

标准 asp.NET 中的 OnActionExecuting 等效项?

asp.net中的页面卸载事件