没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2010-11-24 14:05:31.000|阅读 457 次
概述:对于每一个.NET程序员,对于ASP.NET页面生命周期都有一定的了解和把握。本文主要是从继承以及视图状态,事件,委托,容器控件以及子控件这些方面来把握和控制整体的页面生命周期。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
对于每一个.NET程序员,对于ASP.NET页面生命周期都有一定的了解和把握。本文主要是从继承以及视图状态,事件,委托,容器控件以及子控件这些方面来把握和控制整体的页面生命周期。
先看下下面4个相关页面的代码(为降低复杂度,很多代码被删减与精简,仅提供最基本的操作代码)。仅仅几个文件,先看下整体文件的布局,有一个整体的把握。
(一)父类的相关事件以及处理
1 public class UserParentPage:System.Web.UI.Page
2 {
3 /// <summary>
4 /// 对回传数据的处理,以及其他内容的设置、获取
5 /// </summary>
6 /// <param name="e"></param>
7 protected override void OnInit(EventArgs e)
8 {
9 Core.Trace.TraceInfo("UserParentPage OnInit");
10 base.OnInit(e);
11 //编写相应的代码防止SQL注入
12 //System.Web.HttpContext.Current.Request.QueryString/Form
13 //根据上下文对象来检测,以及做出相应的处理
14 //以及其他一些内容的设置、控制等等
15 }
16
17 protected override void OnLoad(EventArgs e)
18 {
19 Core.Trace.TraceInfo("UserParentPage OnLoad");
20 base.OnLoad(e);
21 //编写相应的代码对整体页面的控制
22 }
23 }
(二)用户控件(子控件)的相关内容
1 public partial class UserEventControl : System.Web.UI.UserControl
2 {
3 public delegate void ChangedHandler();
4 public event ChangedHandler Changed;
5 private void Page_Load(object sender, System.EventArgs e)
6 {
7 Core.Trace.TraceInfo("UserEventControl OnLoad");
8 if (!Page.IsPostBack)
9 {
10 Core.Trace.TraceInfo("UserEventControl OnLoad !Page.IsPostBack==true");
11 SetContent();
12 }
13 }
14 private void SetContent()
15 {
16 int len =12,num = 2,perRowMaxCount=8;
17 System.Text.StringBuilder table = new System.Text.StringBuilder();
18 for (int i = 0; i <= num; i++)
19 {
20 table.Append(@"<table bordercolor='black' width='100%'><tr align='left'>");
21 for (int j = 0; j < perRowMaxCount; j++)
22 {
23 int p = i * perRowMaxCount + j;
24 if (p < len)
25 {
26 string paramValue ="param"+p.ToString();
27 string showValue ="show"+p.ToString();
28 table.Append(string.Format(@"<td width='12.5%'><a href='javascript:__doPostBack(""{2}"",""{0}"")' CommandName=""{0}"" class='line'><font>{1}</font></a></td>", paramValue,showValue, lbtnShow.ClientID.Replace("_lbtnShow", "$lbtnShow")));
29 }
30 else
31 {
32 table.Append(string.Format(@"<td width='12.5%'></td>"));
33 }
34 }
35 table.Append(@"</tr></table>");
36 }
37 lblShow.Text = table.ToString();
38 }
39
40 public string CurrentID
41 {
42 set
43 {
44 ViewState["CurrentID"] = value;
45 }
46 get
47 {
48 return (string)ViewState["CurrentID"];
49 }
50 }
51
52 protected override void OnInit(EventArgs e)
53 {
54 Core.Trace.TraceInfo("UserEventControl OnInit");
55 InitializeComponent();
56 base.OnInit(e);
57 }
58
59 private void InitializeComponent()
60 {
61 this.lbtnShow.Click += new System.EventHandler(this.lbtnShow_Click);
62 this.Load += new System.EventHandler(this.Page_Load);
63 }
64 /// <summary>
65 /// 单击时将触发
66 /// </summary>
67 /// <param name="sender"></param>
68 /// <param name="e"></param>
69 private void lbtnShow_Click(object sender, System.EventArgs e)
70 {
71 Core.Trace.TraceInfo("UserEventControl lbtnShow_Click");
72 CurrentID = Request.Form["__EVENTARGUMENT"];//获取回传值
73 SetContent();//设置内容----因为有些内容被修改过,如样式什么的,本例忽略
74 Changed();//触发事件
75 }
76 }
上面最主要的3点:
(1)javascript:__doPostBack()和Request.Form["__EVENTARGUMENT"];__doPostBack()第一个参数必须用控件的name 而不是ID。控件名为将父控件ID用$符号连接起来的。第二个参数是传给控件的Value值。第一个参数对应 Request.Form["__EVENTTARGET"]; 第二个参数对应Request.Form["__EVENTARGUMENT"]。此函数是DOTNET 的服务器控件产生的,所以要使用此函数,必须整个页面上至少要有一个控件可以回传页面。其实,dotnet 服务器控件在页面上产生两个隐藏的控件一个名为__EVENTTARGET ,另一个名为__EVENTARGUMENT。
(2)ViewState视图状态保存的是页面级别的内容。CurrentID = Request.Form["__EVENTARGUMENT"];
(3)点击后将导致事件的触发(回传)。 Changed();
(三)页面的事件与委托处理
1 public partial class Default : Core.UserParentPage
2 {
3 protected void Page_Init(object sender, EventArgs e)
4 {
5 Core.Trace.TraceInfo("Default OnInit");
6 }
7
8 protected void Page_Load(object sender, EventArgs e)
9 {
10 Core.Trace.TraceInfo("Default Page_Load");
11 userEventControl.Changed+=new UserControl.UserEventControl.ChangedHandler(userEventControl_Changed);
12 }
13
14 private void userEventControl_Changed()
15 {
16 Core.Trace.TraceInfo("Default userEventControl_Changed");
17
18 string id = userEventControl.CurrentID;
19 ViewState["ID"] =id;//保存状态进行相应的处理
20 lblShow.Text =id;
21 }
22 }
这一步最关键,利用userEventControl.Changed+=new UserControl.UserEventControl.ChangedHandler(userEventControl_Changed),当事件触发时,我们能够通过userEventControl_Changed()方法获取点击的value值,用视图状态保存该值,进而进行相应的操作(控制)。页面显示如下:
(四)跟踪文件为当前目录下的trace.txt文件
public static class Trace
{
private static string logPath = HttpContext.Current.Request.PhysicalApplicationPath;
public static void TraceInfo(string information)
{
string path = logPath + @"trace.txt";
string sqltemp = DateTime.Now.ToString("yyy-MM-dd hh:mm:ss fff") + ": " + information;
FileStream fs = null;
if (!File.Exists(path))
{
fs = File.Create(path);
fs.Close();
}
StreamWriter sw = new StreamWriter(path, true, Encoding.UTF8);
sw.WriteLine(sqltemp);
sw.Close();
}
}
在每个页面上的事件中增加自定义跟踪,可以发现如下情况:Init和Load都在每个控件上递归方式发生,但它们发生的顺序是相反的。每个子控件的Init与Unload事件在其容器引发相应的事件之前发生。容器的Load事件是在其子控件的Load事件之前发生。
trace.txt内容显示如下(生成页面的过程以及点击事件触发跟踪):
2010-11-23 02:26:29 828: UserEventControl OnInit
2010-11-23 02:26:29 828: UserParentPage OnInit
2010-11-23 02:26:29 828: Default OnInit
2010-11-23 02:26:29 828: UserParentPage OnLoad
2010-11-23 02:26:29 828: Default Page_Load
2010-11-23 02:26:29 828: UserEventControl OnLoad
2010-11-23 02:26:29 828: UserEventControl OnLoad !Page.IsPostBack==true
2010-11-23 02:26:29 828: UserEventControl OnLoad
2010-11-23 02:26:29 828: UserEventControl OnLoad !Page.IsPostBack==true
2010-11-23 02:26:31 171: UserEventControl OnInit
2010-11-23 02:26:31 171: UserParentPage OnInit
2010-11-23 02:26:31 171: Default OnInit
2010-11-23 02:26:31 171: UserParentPage OnLoad
2010-11-23 02:26:31 171: Default Page_Load
2010-11-23 02:26:31 171: UserEventControl OnLoad
2010-11-23 02:26:31 171: UserEventControl OnLoad
2010-11-23 02:26:31 171: UserEventControl lbtnShow_Click
2010-11-23 02:26:31 171: Default userEventControl_Changed
从前面的6句可以看出,子控件UserEventControl 的Init事件发生在UserParentPage 以及Default 的Init事件之前,而子控件UserEventControl 的Load事件发生在UserParentPage 以及Default 的Load事件之后。其中,父类UserParentPage 的事件发生在子类Default 的事件之前。
注:
2010-11-23 02:26:29 828: UserEventControl OnLoad
2010-11-23 02:26:29 828: UserEventControl OnLoad !Page.IsPostBack==true
2010-11-23 02:26:29 828: UserEventControl OnLoad
2010-11-23 02:26:29 828: UserEventControl OnLoad !Page.IsPostBack==true
这个地方明显有点不对劲,再反过去查看下子控件事件中的代码。发现
1 private void InitializeComponent()
2 {
3 this.lbtnShow.Click += new System.EventHandler(this.lbtnShow_Click);
4 this.Load += new System.EventHandler(this.Page_Load);
5 }
多了这一行this.Load += new System.EventHandler(this.Page_Load); Load事件中再一次触发了子控件的Page_Load方法,因此注销掉该句。
到此我们再看一下跟踪文件中的内容(将原有记录全清空),如下所示:
1 2010-11-23 02:46:11 281: UserEventControl OnInit
2 2010-11-23 02:46:11 281: UserParentPage OnInit
3 2010-11-23 02:46:11 281: Default OnInit
4 2010-11-23 02:46:11 281: UserParentPage OnLoad
5 2010-11-23 02:46:11 281: Default Page_Load
6 2010-11-23 02:46:11 281: UserEventControl OnLoad
7 2010-11-23 02:46:11 281: UserEventControl OnLoad !Page.IsPostBack==true
8 2010-11-23 02:46:13 265: UserEventControl OnInit
9 2010-11-23 02:46:13 265: UserParentPage OnInit
10 2010-11-23 02:46:13 265: Default OnInit
11 2010-11-23 02:46:13 265: UserParentPage OnLoad
12 2010-11-23 02:46:13 265: Default Page_Load
13 2010-11-23 02:46:13 265: UserEventControl OnLoad
14 2010-11-23 02:46:13 265: UserEventControl lbtnShow_Click
15 2010-11-23 02:46:13 281: Default userEventControl_Changed
这里就分成了2次操作,第1次为加载显示的过程(1-7句),第2次为点击获取相应的值的过程(8-15句)。过程是差不多的,仅仅多了一个回传事件。这与上面总结的是一致的。
总结
通过父类、子类以及子控件之间的关系,加强对页面生命周期的理解,精简不必要的操作。通过事件和委托、视图状态能够很好的完成某些复杂的功能,具体应用本文将不再讲叙,仅仅是给读者一个引子。合理利用javascript:__doPostBack()和Request.Form["__EVENTARGUMENT"]能获得意想不到的效果。Init和Load都在每个控件上递归方式发生,但它们发生的顺序是相反的。每个子控件的Init与Unload事件在其容器引发相应的事件之前发生。容器的Load事件是在其子控件的Load事件之前发生。这个仅仅是本人以前实现的功能的一个精简版本,希望对各位有所帮助。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号