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

本文介绍了一种在ASP.NET项目中优化用户自定义控件的方法,通过设计一个框架来确保某些代码块仅在首次加载时执行,避免重复运行的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个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下载 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值