在一个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下载
本人是菜鸟,很多不足之处,请多多指出,谢谢。