ASP.NET页面中Page_Load事件被触发两次

45

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

不,我没有在任何地方调用 page load 函数...


3
可以举一个代码示例......而且您有没有考虑过这样一个事实:可能会有一个AJAX调用两次到您的页面,或者您正在进行无限重定向? - Rob
请包含任何能帮助我们查看问题的代码。此外,你的页面代码中可能有一个__doPostBack调用。 - Doug Chamberlain
嗨Bob和Doug,感谢你们的回复。我检查了一下代码,没有AJAX调用和doPostBack调用。你们知道页面可以以多少种方式进行两次提交吗? - Goutham
这是一个很长的插槽。https://dev59.com/RnI-5IYBdhLWcg3wHUhB - hIpPy
17个回答

33

刚遇到这个问题,我想发表一个回答总结我找到的东西,以及我的实际问题。

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 
7. Page uses ScriptManager and "initializes" the loading panel by issuing a 
   postback from javascript.

最后是我的问题...
我的页面继承自一个包含了一个Page Load处理程序的类,该类又继承自一个带有Page Load处理程序的类。
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,它会被调用三次...

2
我在我的母版页中将AutoEventWireUp设置为false,这对我很有帮助。将其删除并没有起到作用。 - AlignedDev
这正是我的问题。从基类继承而来。我从子类中删除了handles类,这样它就不再重复触发了。 - user158017
我的问题是这些还有其他的东西。一旦我整理了代码,将页面和主页切换到AutoEventWireup="true",并且删除了主页和页面中所有的页面加载事件处理程序,接下来我必须将我的主页的命名空间改为与项目相同。 - Marnee KG7SIO
对我来说,img标签src="#"导致了page_load事件被触发两次。 - Pranesh Janarthanan
谢谢!关闭AutoEventWireup起作用了。 - davelabaw

18

ASP.NET的工作方式导致页面会自动提交,从而调用页面加载函数,这并不是你调用页面加载函数两次的原因。当页面上有任何设置为回传的服务器控件(Server controls)被触发时,页面就会自动提交。

你需要进行一些检查,以区分初始页面加载和回传。

if(!IsPostBack) 
{  
//Code when initial loading 
}
 else 
{ 
// code when post back 
}

1
哇,我还记得这是10年前的事情! - Preet Sangha
8
IsPostBack不是答案。从外部网站重定向似乎会导致两次加载,这两次加载并非PostBack。我花了一整天时间困扰于此,最终采取了下游的补偿措施。 - Bob Clegg
1
救命稻草,谢谢Julius。这意味着第一个Page_Load用于初始化内容,第二个Page_Load用于执行(IsPostBack)块中的任何代码,然后是任何事件处理程序。 - mn.
很遗憾,我在2022年遇到了这个问题。我感到自己老了,没有跟上技术的最新发展。 - Edgar J. Rodriguez

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

  1. 检查加载事件是否为基类和子类设置了处理程序 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load, Me.Load**

  2. 如果只是移除事件中的Me.Load,然后检查您的页面。 希望这可能有用并解决您的问题。


8

我曾在一个项目中发现以下字符串:

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

有人像通常使用“a href”一样处理了它。但是浏览器实际上会在每次刷新时尝试获取站点图标,因此它会向href参数中的地址发送请求,即向同一页发送请求。

因此,请注意检查此问题。


2
在使用<img src="#" />标签时,我也遇到了同样的问题。棘手的部分是,额外的请求(对同一页面的GET请求)不会显示在Chrome Dev工具中。不确定为什么或如何可能发生这种情况。 另外:我最初使用“#”src'd图像的唯一原因是,在操作<td>的DOM时,IE8给我带来了问题。 - ironsam
1
我也遇到过类似的问题,但我的src值是“有效”的。我没有添加前导“/”。src值为“resources/images/button.png”,一旦更改为“/resources/images/button.png”,只有一个页面加载。如果有人能解释原因,我会非常感兴趣。谢谢。 - Ads

7
对我来说,它是一张空白的图像标签。
      <img src="#" />

4
记得像下面展示的那样检查IsPostBack值:
    protected void Page_Load(object sender, EventArgs e)
    {
            if (!this.IsPostBack)

您可以在此 IF 块内设置断点以验证您是否运行了两次 Page_Load。 如果您看到 Page_Load 运行两次,并且每次都不是 postback,请检查此页面的 OnInit() 方法。 请验证您未像下面这样连接 Load 处理程序。您将经常看到来自早期版本的 Visual Studio 的代码中出现此代码。

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

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

(说明:此段文字为提示,无需翻译)

4

我通过将AutoEventWireUp属性设置为FALSE来解决了我的问题。当我从.NET 1.1迁移到.NET 4.0时,出现了这个问题。不知何故,在我从旧版本复制文件时,VS2012会将此属性重置为TRUE。


2
我遇到的问题是,当我将AutoEventWireUp设置为FALSE时,页面加载事件现在根本不会触发。 - Micro

2
页面对象调用页面对象上的OnLoad方法,然后递归地对每个子控件执行相同操作,直到页面和所有控件都被加载。单个控件的加载事件会在页面的加载事件之后发生。
使用OnLoad事件方法来设置控件属性并建立数据库连接。
请参考MSDN:链接描述

2

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

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

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

因此,只要您的内部链接在URL末尾都有“/”,一切就会正常工作,以避免多次加载。


1
这对我有用。我将URL从“/preload.aspx”更改为“/preload.aspx/”,现在Page_Load仅被调用一次。 - Gandalf458

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接