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

时间:2011-01-24 18:46:19

标签: asp.net webforms

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

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

16 个答案:

答案 0 :(得分:32)

刚遇到这个问题,我想我会发一个总结我找到的答案的答案,加上我的实际问题。

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

最后我的问题......

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

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次......

答案 1 :(得分:17)

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

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

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

答案 2 :(得分:11)

请在这里找到解决方案........

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

  2. 如果只是从活动中删除 Me.Load ,请检查您的页面。希望这可能有用并解决您的问题。

答案 3 :(得分:7)

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

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

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

所以,请检查一下。

答案 4 :(得分:7)

对我来说这是一张空白图片标签。

      <img src="#" />

答案 5 :(得分:4)

请记住检查IsPostBack值,如下所示:

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

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

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

如果找到它,请删除它。这假设您在页面的标记顶部有以下内容。    AutoEventWireup =&#34;真&#34;

答案 6 :(得分:3)

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

答案 7 :(得分:3)

我有同样的问题并解决了。

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

当请求的页面时,URL没有&#34; /&#34;在URL的末尾,重定向发生在&#34; x.com/x"到&#34; x.com/x /&#34;根据我对SEO标准的配置。

所以一切运作良好,你的内部链接应该有&#34; /&#34;在URL的末尾,以避免多次加载。

答案 8 :(得分:2)

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

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

Reffer MSDN:enter link description here

答案 9 :(得分:1)

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

BTW我用Google搜索Page_Load Being called twice

答案 10 :(得分:0)

我有同样的问题。 这是因为TreeNode的ImageUrl =“”。

答案 11 :(得分:0)

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

protected override void OnPreRender(EventArgs e)

这只被调用一次,即使onload&s和init被称为百万次。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

对我来说,它是通过删除

来解决的
Handles Me.Load 

并改变方法,如

Protected Overrides OnLoad(...)

答案 14 :(得分:0)

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

<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的原因。在旧的遗留代码中,有些页面是&#39; .aspx.designer.cs文件包含的不一致性,直到现在才显然没有引起问题。我没有尝试修复,而是创建了新的页面,这消除了双重加载事件。

答案 15 :(得分:0)

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