asp.net 避免用户自定义控件的父类代码多次运行

来源:互联网 发布:软件待着带着没响应 编辑:程序博客网 时间:2024/06/08 00:04

在一个asp.net项目中,用户自定义控件是很经常使用的,一个项目中一般都会有多个用户自定义控件,而为了代码重用,通常这些控件都会继承一个父类,

一个页面还会引用多个用户自定义控件。

这种情况如果不注意控制就会出现父类中的代码多次运行。

这种情况是真实存在的,我新到现在的公司,参与一个项目的改版的时候,发现了这样的现象,为了避免这样的情况再次出现,我简单设计了一个框架。

一个自定义控件的父类:UCBase.cs

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using UCLibrary.Page;namespace UCLibrary.UC{    public class UCBase : System.Web.UI.UserControl    {        public UCBase()        {            this.Load += DoAction;        }        private void DoAction(object o, EventArgs e)        {            PageBase page = (PageBase)this.Page;            if (page.State == UCBaseState.FirstLoading)            {                page.State = UCBaseState.Loading;                OnFirstLoading(page);            }        }        protected virtual void OnFirstLoading(PageBase page)        {            //TODO:只运行一次的代码            Response.Write("<script>alert('运行了用户自定义事件第一次加载事件')</script>");        }    }    public enum UCBaseState : byte    {        UnLoad = 0,        FirstLoading = 1,        Loading = 2,        End = 3    }}


一个页面的父类:PageBase.cs

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using System.Web.UI;using UCLibrary.UC;namespace UCLibrary.Page{    public class PageBase : System.Web.UI.Page    {        private UCBaseState _State = UCBaseState.UnLoad;        /// <summary>        /// 页面自定义控件的状态        /// </summary>        public UCBaseState State        {            get { return _State; }            set { _State = value; }        }        public PageBase()        {            this.Load += SetUCBaseStateToFirst;            this.Unload += SetUCBaseStateToEnd;        }        protected virtual void SetUCBaseStateToFirst(object sender, EventArgs e)        {            this.State = UC.UCBaseState.FirstLoading;        }        protected virtual void SetUCBaseStateToEnd(object sender, EventArgs e)        {            this.State = UC.UCBaseState.End;        }    }}

使用的方式就是用户自定义控件都继承UCBase,页面都继承PageBase,

只运行一个的代码就写在OnFirstLoading里

demo下载,不用积分的:demo下载 

本人是菜鸟,很多不足之处,请多多指出,谢谢。

原创粉丝点击