`
灵雨飘零
  • 浏览: 35045 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
文章分类
社区版块
存档分类
最新评论

理解Asp.Net自定义控件的生命周期

 
阅读更多

大家在平时学习Asp.Net进行web开发时,为了满足项目需要,将开发大量满足需求的自定义控件。那关于自定义控件的生命周期如何呢,与页面生命周期有何区别呢?我今天跟大家详细解释一下:控件生命周期大概有11个阶段,对于特殊的页面(其实也是一种控件System.Web.UI.Page)的生命周期有更详细的阶段,比如对于每一种控件来说,都只有一个Init事件,但是Page对同一个事件却分成了PreInit, Init, InitComplete三个阶段。其具体的职责如下:

PreInit: 完成模板页和主题的设置,只有这一次机会,一旦到了Init阶段将不能更改。

Init: 依次触发子控件的Init事件,进而执行对应的OnInit方法,完成子控件的初始化和设置命名容器。

InitComplete: 使控件具体视图跟踪能力。

下面具体说明控件生命周期的11阶段:

1.初始化(对应OnInit方法)

完成控件的初始化并通过ProcessRequest方法递归遍历所有的子控件以及依次调用它们的OnInit方法。可以通过重写OnInit方法来扩展功能或增加初始化内容。除此之外,本阶段将打开控件的视图跟踪功能(调用TraceViewState方法),这样才能在页面回发时正确恢复控件的属性。

2.加载视图状态(对应LoadViewState方法)

本阶段仅在页面回发时才执行,事实上,在第一次访问页面时还没有获取到存储在视图状态中的数据。本阶段完成加载视图状态到控件(前提是该控件启用视图状态),对于复杂对象则需要重写LoadViewState方法和SaveViewState方法。在每一次客户端请求过程中,视图状态存储在隐藏控件中,每次请求都会将ViewState回传到服务器,以便在服务器回传数据以及判断是否执行相应的回发事件。

3.加载回传数据(对应LoadPostData方法)

本阶段仅在页面回发时才执行,LoadPostData是实现接口IPostBackDataHandler的一个方法(主要实现控件数据回传)。该方法有一个参数NameValueCollection类型对象,装载了客户端提交的数据。根据控件旧值和新值比较是否一致,决定是否执行下面的RaisePostDataChangedEvent方法。具体过程如下:客户端修改窗体的数据提交后,接受的数据以“&”符号隔开的一些键值对,页面处理器根据传递的数据控件集合,根据匹配ID对应的服务器控件是否实现IPostBackDataHandler接口,如实现此接口则调用控件的LoadPostData方法以刷新其值,否则不调用。

4.装载(对应OnLoad方法)

注意,页面装载时先执行页面的Page_Load事件再依次递归执行各个子控件的OnLoad方法。本阶段控件树结构中的所有控件已经创建并完成初始化,且状态已还原和回传给客户端,可以重写OnLoad方法完成一些所有请求共有的操作,还可以通过IsPostBack判断控件是在第一次请求页面还是回发页面时执行自定义初始化代码逻辑。

5.数据回传事件通知(对应RaisePostDataChangedEvent方法)

本阶段仅在页面回发时才执行,RaisePostDataChangedEvent是实现接口IPostBackDataHandler的一个方法(主要实现控件数据回传事件)。与LoadPostData匹配使用,当前者返回true时,才调用RaisePostDataChangedEvent方法。

6.触发回发事件(对应RaisePostBackEvent方法)

本阶段仅在页面回发时才执行,主要处理引起回发的客户端事件,成功捕获回发的客户端事件进行服务端的相应处理。前提是实现IPostBackEventHandler接口。可以判断是哪个控件引发的回发事件,从而进行不同的事件处理。

7.预呈现(对应OnPreRender方法)

本阶段主要完成控件呈现(Render)之前的一些工作,一般自定义控件都会重写方法,对资源进行注册(Javascript和隐藏域)。

8.保存视图状态(对应SaveViewState方法)

与LoadViewState过程正好相反,SaveViewState用于存储页面视图状态信息。SaveViewState在第一次页面请求时就会执行,而LoadViewState仅在页面回发时执行。

9.呈现(对应Render方法)

本阶段主要完成控件标记和字符文本输出到服务器控件的输出流中。可以直接写Html,也可调用控件的RenderControl输出到流中。

10.卸载(对应OnUnload方法)

本阶段将清除页面的资源。OnUnload仅是一个控件生命周期内的事件,如果认为该方法会在离开页面时或点击关闭按钮时触发是不正确的,因为页面两次请求是无状态的,而因为Asp.Net视图状态机制看起来好像连续的。

11.释放(对应Dispose方法)

本阶段将释放资源(数据库连接,IO文件等)。

了解了吗?如果理解了,我将这个过程用代码的形式描述出来,希望能有一个更加直观的认识。

[DefaultProperty("Text")]
[ToolboxData("<{0}:ControlLifeCycle runat=server></{0}:ControlLifeCycle>")]
public class ControlLifeCycle : WebControl, IPostBackDataHandler, IPostBackEventHandler
{
    /// <summary>
    /// 1. 初始化
    /// </summary>
    /// <param name="e"></param>
    protected override void OnInit(EventArgs e)
    {
        Output("1. OnInit");
        base.OnInit(e);
        this.Page.RegisterRequiresPostBack(this);
    }

    /// <summary>
    /// 2. 装载视图
    /// </summary>
    /// <param name="savedState"></param>
    protected override void LoadControlState(object savedState)
    {
        Output("2. LoadControlState");
        base.LoadControlState(savedState);
    }

    /// <summary>
    /// 3. 回传数据处理
    /// </summary>
    /// <param name="postDataKey"></param>
    /// <param name="postCollection"></param>
    /// <returns></returns>
    public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        Output("3. LoadPostData");
        return true;
    }

    /// <summary>
    /// 4. 加载事件
    /// </summary>
    /// <param name="e"></param>
    protected override void OnLoad(EventArgs e)
    {
        Output("4. OnLoad");
        base.OnLoad(e);
    }

    /// <summary>
    /// 5. 回传事件通知
    /// </summary>
    public virtual void RaisePostDataChangedEvent()
    {
        Output("5. RaisePostDataChangedEvent");
    }

    /// <summary>
    /// 6. 触发回传事件
    /// </summary>
    /// <param name="eventArgument"></param>
    public virtual void RaisePostBackEvent(string eventArgument)
    {
        Output("6. RaisePostBackEvent");
    }

    /// <summary>
    /// 7. 预呈现
    /// </summary>
    /// <param name="e"></param>
    protected override void OnPreRender(EventArgs e)
    {
        Output("7. OnPreRender");
        base.OnPreRender(e);
    }

    /// <summary>
    /// 8. 保存视图状态
    /// </summary>
    /// <returns></returns>
    protected override object SaveViewState()
    {
        Output("8. SaveViewState");
        base.SaveViewState();
        return new Pair();
    }

    /// <summary>
    /// 9. 呈现
    /// </summary>
    /// <param name="writer"></param>
    protected override void Render(HtmlTextWriter writer)
    {
        writer.Write("<input type='button' name='{0}' value='Click Me' style='position:absolute;left:20px;top:280px' onclick=\"{1}\"/>",
                     "[控件生命周期]", Page.ClientScript.GetPostBackEventReference(this, ""));
        Output("9. Render");
        base.Render(writer);
    }

    /// <summary>
    /// 10. 卸载
    /// </summary>
    /// <param name="e"></param>
    protected override void OnUnload(EventArgs e)
    {
        Output("10. OnUnload");
        base.OnUnload(e);
    }

    /// <summary>
    /// 11. 释放资源
    /// </summary>
    public override void Dispose()
    {
        Output("11. Dispose");
        base.Dispose();
    }

    private void Output(string content)
    {
        if (!this.DesignMode)
        {
            HttpContext.Current.Response.Write(content + "<br/>");
        }
    }
}


以上就是自定义控件的整个生命周期,明白了这些,开发自定义控件时将游刃有余。

分享到:
评论

相关推荐

    ASP.NET用户控件和自定义控件

    3. 可能需要重写CreateChildControls方法,用于在控件生命周期中创建和管理子控件。 4. 添加属性、事件和方法,使自定义控件具有所需的功能。 5. 使用编译后的自定义控件库在ASP.NET页面中引用并使用控件。 例如,...

    ASP.NET自定义控件源代码

    ASP.NET是一种基于.NET Framework的...通过这个源代码学习,你可以深入理解ASP.NET自定义控件的工作原理,以及如何根据实际需求构建自己的控件库,提高开发效率。同时,这也是提升.NET框架技能和Web开发能力的好机会。

    asp.net自定义控件代码例子

    在ASP.NET中,自定义控件是开发人员为了满足特定需求而创建的具有独特功能的服务器控件。...记住,实践是最好的老师,尝试创建自己的自定义控件并将其应用于实际项目,这将加深你对ASP.NET自定义控件的理解。

    asp.net 自定义控件 抽屉控件

    ASP.NET自定义控件是开发高效、可复用的Web应用程序的重要组成部分。抽屉控件是一种常见的UI元素,常用于实现折叠式展示内容,提高页面的用户体验和空间利用效率。在ASP.NET中创建一个抽屉控件需要理解控件生命周期...

    asp.net GridView自定义控件源码

    ASP.NET GridView 是一个非常...为了更好地利用这个源码,你需要理解ASP.NET控件生命周期,了解数据绑定机制,以及如何在代码-behind中操作控件。同时,熟悉CSS和HTML也是必要的,因为美化部分很可能是通过CSS完成的。

    asp.net自定义控件

    ASP.NET自定义控件是ASP.NET框架中的一个重要组成部分,它允许开发者根据项目需求创建具有特定功能的、可重用的用户界面元素。在ASP.NET中,自定义控件提供了扩展和定制现有内置控件或者完全构建新控件的能力。本文...

    asp.net自定义控件开发实例(学习)

    打开项目,查看源代码,理解每个部分的作用,然后尝试修改和扩展这些控件,以加深对ASP.NET自定义控件开发的理解。 总之,掌握ASP.NET自定义控件开发不仅可以提升开发效率,还能帮助你创建具有独特功能和设计的Web...

    asp.net自定义控件教程

    ### ASP.NET自定义控件教程知识点详解 ...通过以上详细介绍,我们可以看到,ASP.NET自定义控件的开发不仅需要扎实的技术基础,还需要对用户需求有深入的理解。希望这篇教程能帮助读者更好地掌握自定义控件的开发技巧。

    ASP.NET自定义控件组件开发

    ASP.NET自定义控件组件开发是一项关键技能,用于构建具有特定功能和外观的网页界面元素。自定义控件能够满足开发者对于网站个性化和扩展性的需求,使得开发者可以根据项目需求定制功能,提高代码重用率,简化开发...

    asp.net自定义控件,内含我写的一个文档,简单易学

    ASP.NET自定义控件是.NET框架提供的一种强大功能,它允许开发者扩展标准的HTML控件,以满足特定项目的需求。...通过阅读提供的文档和分析`ControlDemo`示例,你将能够进一步提升在ASP.NET自定义控件领域的技能。

    ASP.NET 自定义日历控件

    在这个场景中,我们主要关注的是如何实现ASP.NET中的ASP.NET自定义日历控件,并将其与TextBox结合使用。 首先,ASP.NET提供了内置的Calendar控件,它可以轻松地创建一个交互式的日历界面。然而,为了满足特定的UI...

    .net 自定义控件

    通过查看和分析这些代码,你可以更好地理解.NET自定义控件的实现细节,包括如何处理生命周期方法,如何响应用户交互,以及如何优化性能等。 总之,.NET自定义控件是提高开发效率和实现独特功能的重要工具。通过熟练...

    Asp.net写的一个关于打印的自定义控件

    - 自定义控件需要考虑服务器端和客户端的交互,因此需要对ASP.NET的页面生命周期和JavaScript有深入理解。 4. 文件名"Print"可能表示这个压缩包内包含了一个名为"Print"的文件或文件夹,这可能是源代码文件、示例...

    一个可创建Google Calendar Event hyperlinks 的ASP.NET 自定义控件源码

    本主题将深入探讨一个针对"Google Calendar Event hyperlinks"的ASP.NET自定义控件源码,该控件允许用户方便地创建指向Google日历事件的链接。 首先,我们需要理解什么是自定义控件。在ASP.NET中,自定义控件是通过...

    asp.net 自定义控件中的嵌入脚本图片等资源的一些总结

    总之,ASP.NET自定义控件提供了强大的能力来扩展和定制Web应用的界面。掌握如何有效地处理嵌入脚本、图片和其他资源,将使我们的控件更强大、更灵活,同时也提高了代码质量和用户体验。通过持续学习和实践,我们可以...

    asp.net 自定义控件中的嵌入脚本图片等资源

    综上所述,ASP.NET自定义控件的开发涉及到脚本、资源管理等多个方面,理解并熟练掌握这些技巧,能帮助开发者构建出功能强大且易于维护的Web应用。通过实践和探索,我们可以进一步优化资源嵌入和管理,提升应用性能。

    asp.net 自定义分页

    通过学习和理解这些代码,你可以更好地掌握ASP.NET自定义分页的实现方式。 总的来说,自定义分页在ASP.NET中是一个相对复杂但必不可少的功能。它需要开发者具备良好的数据库操作能力,以及对ASP.NET页面生命周期的...

Global site tag (gtag.js) - Google Analytics