奇怪,页面的 OnLoad 方法会执行 2 次!

shove 2009-01-10 10:26:32
一、PageBase.cs:

public class PageBase : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
using (FileStream fs = new FileStream("e:\\aaaa.txt", FileMode.Append, FileAccess.Write, FileShare.Write))
{
StreamWriter writer = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GBK"));

writer.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + System.DateTime.Now.Millisecond.ToString() + "\t\t" + "aaaaaaaaaaaaaaaaa1" + "\r\n");

writer.Close();
}
}
}

二、Default.aspx.cs:

public partial class _Default : PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
}
}


一个简单的页面继承。
这样写,打开网页,文本文件被增加一条记录,正常。刷新一下后,又增加一条,也正常。

-----------------------------------------------------------------------
但是: 当把以上基类单独放到一个项目中,编译成 .dll,再包含到网站,情况就不同了。

一打开网页,就运行了 2 次,文本文件中被增加 2 条记录,刷新一下页面,又增加 2 次。

很是奇怪。

哪位大侠把机制讲解一下。
...全文
1182 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonykam 2011-04-22
  • 打赏
  • 举报
回复
天啊,原来是这样,感激不尽,我为这个问题郁闷了好久。
shove 2009-01-15
  • 打赏
  • 举报
回复
罪魁祸首是:

<img src="" .... />

当页面上出现了 src="" 空串时,
Page_Load、 OnLoad、 Init 等等都执行 2 次。

我上面说的那个控件中出现了这个,所以导致执行 2 次。

而该Web自定义用户控件如果不重写 Render, 用自己默认的方法,就不会。

--------------------------------------------------

总之, <img src="" 换为 <img src="about:blank" 就没有任何问题了。
shove 2009-01-14
  • 打赏
  • 举报
回复
为了不给大家造成误导,特修正我自己在 41 楼的错误:

1、经晚上仔细研究,不是 Ajax 执行了一次 OnLoad
2、是页面上的自定义用户控件造成的。

现象:Web自定义用户控件,如果不重写 Render 方法,则不会造成 OnLoad 2 次执行,如果 protected override void Render(HtmlTextWriter output) 改写这个方法,则会造成 OnLoad 2 次执行。
与 IsPostBack 无关。
shove 2009-01-13
  • 打赏
  • 举报
回复
谢谢各位,问题解决:

页面上有一个用户控件,用户控件使用了 Ajax。

Ajax 执行了一次页面的 OnLoad。
cwmwss 2009-01-12
  • 打赏
  • 举报
回复
学习
钊xsun 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 shove 的帖子:]
一、PageBase.cs:

public class PageBase : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
using (FileStream fs = new FileStream("e:\\aaaa.txt", FileMode.Append, FileAccess.Write, FileShare.Write))
{
StreamWriter writer = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GBK"));

writer.WriteLine(System.Date…
[/Quote]
你在pagebase.cs类里重载了onload的方法,当然是执行了两次了。
页面刚打开时是先执行类里的,然后再执行page_onload里的。你调试下就知道了
一弗楚 2009-01-11
  • 打赏
  • 举报
回复
up
shove 2009-01-11
  • 打赏
  • 举报
回复
谢谢大家。

sp1234 大侠,不好意思,我的代码不是复制粘贴过来的,是在 CSDN 上敲的(因为省去了一些东西)。
原文有 base.OnLoad(e);

----------------------------------------

我现在怀疑是 Ajax 运行了一次 OnLoad.
因为页面上有 Ajax 的东西。
NaNorth 2009-01-11
  • 打赏
  • 举报
回复
用 Page.IsPostBack 是很靠谱的
阿彪兄 2009-01-10
  • 打赏
  • 举报
回复
支持一下
kimmking 2009-01-10
  • 打赏
  • 举报
回复
各楼的还都不行的话,楼主可以保存开发环境和示例,
给asp.net开发组报一个bug了。
kimmking 2009-01-10
  • 打赏
  • 举报
回复
1、检查设计器里的代码,是不是注册了两次
2、清空vs的缓存,清理,重新编译,运行


还不行的话,没办法了,
当年,慕白兄和思归都没搞定:
http://topic.csdn.net/t/20041210/15/3634069.html
shove 2009-01-10
  • 打赏
  • 举报
回复
楼上改了哪里啊,没看到
walkghost 2009-01-10
  • 打赏
  • 举报
回复
有事件回发吧?
每次回发都会执行page_load。
zzxap 2009-01-10
  • 打赏
  • 举报
回复
改成这样

public class PageBase : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
if(!Page.IsPostBack)
{
using (FileStream fs = new FileStream("e:\\aaaa.txt", FileMode.Append, FileAccess.Write, FileShare.Write))
{
StreamWriter writer = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GBK"));

writer.WriteLine(System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + System.DateTime.Now.Millisecond.ToString() + "\t\t" + "aaaaaaaaaaaaaaaaa1" + "\r\n");

writer.Close();
}
}
}
}

liberpc 2009-01-10
  • 打赏
  • 举报
回复
学习了
孟子E章 2009-01-10
  • 打赏
  • 举报
回复
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);


autoeventWireup ="false"

试试
shove 2009-01-10
  • 打赏
  • 举报
回复
找到的帖子是:

http://topic.csdn.net/t/20041210/15/3634069.html
shove 2009-01-10
  • 打赏
  • 举报
回复
在 CSDN 上找到一个 2004 年的帖子,

但是问题还是没有解决。我的问题与这个基本一样。

绝对不是 IsPostBack, 这个是很基本的。
mengxj85 2009-01-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kongwei521 的回复:]
if(IsPostBack)
{
这是点击事件执行
}
else
{
这个里头是 页面第一次加载 执行的呀。
}
[/Quote]
Up
如此
加载更多回复(24)
什么是SWFUpload?   SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 [编辑本段]SWFUpload的主要特点   * 可以同时上传多个文件;   * 类似AJAX的无刷新上传;   * 可以显示上传进度;   * 良好的浏览器兼容性;   * 兼容其他JavaScript库 (例如:jQuery, Prototype等);   * 支持Flash 8和Flash 9;   SWFUpload不同于其他基于Flash构建的上传工具,它有着优雅的代码设计,开发者可以利用XHTML、CSS和JavaScript来随心所欲的定制它在浏览器下的外观;它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的在文件上传过程中更新页面内容来营造各种动态效果。   在使用SWFUpload之前,请确认你具备一定的JavaScript和DOM知识。在实际开发中,大部分的错误都是由于错误的设置和低劣的Event Handlers处理程序所造成的。 [编辑本段]文档中文翻译   http://www.v-sky.com/doc/swfupload/v2.1.0/Documentation.html [编辑本段]效果演示   * Classic Form Demo http://demo.swfupload.org/formsdemo ;   * Features Demo http://demo.swfupload.org/featuresdemo ;   * Application Demo http://demo.swfupload.org/applicationdemo ;   * v1.0.2 Plugin Demo http://demo.swfupload.org/v102demo ; [编辑本段]选择合适的Flash控件   在发行包(SWFUpload v2)中含有2个版本的Flash控件(swfupload_f8.swf 与wfupload_f9.swf),其中第一个版本拥有最佳的兼容性,但是为此损失了部分功能;而第二个版本提供了一些附加的功能但是损失了兼容性。 [编辑本段]SWFUpload的初始化与配置   首先,在页面中引用SWFUpload.js ,如      然后,初始化SWFUpload ,如   var swfu;   window.onload = function () {   swfu = new SWFUpload({   upload_url : "http://www.swfupload.org/upload.php",   flash_url : "http://www.swfupload.org/swfupload_f9.swf", file_size_limit : "20480"   });   };   以下是一个标准的SWFUpload初始化设置所需的参数,你可以根据需要自己进行删减:   {   upload_url : "http://www.swfupload.org/upload.php", 处理上传请求的服务器端脚本URL   file_post_name : "Filedata", 是POST过去的$_FILES的数组名   post_params : {   "post_param_name_1" : "post_param_value_1",   "post_param_name_2" : "post_param_value_2",   "post_param_name_n" : "post_param_value_n"   },   file_types : "*.jpg;*.gif", 允许上传的文件类型   file_types_description: "Web Image Files", 文件类型描述   file_size_limit : "1024", 上传文件体积上限,单位MB   file_upload_limit : 10, 限定用户一性最多上传多少个文件,在上传过程中,该数字累加,如果设置为“0”,则表示没有限制   file_queue_limit : 2, 上传队列数量限制,该项通常不需设置,根据file_upload_limit自动赋值   fl

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧