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 在操作对我来说,我可以通过使用 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 页面中触发了两次的主要内容,如果未能解决你的问题,请参考以下文章
Page_Load()被多次调用(对于页面中使用的每个JS文件一次)和Page.IspostBack为FALSE