asp.net 控件开发学习笔记(1)

这周末学习了 整理了控件开发的知识,顺便系统的整理下。

asp.net 中控件开发分为 用户控件开发和自定义控件开发。

1.用户控件

用户控件的后缀名为.ascx,用户控件是不能被用户直接访问的,只能嵌入到aspx页面中(设计模式下直接拖入)

<%@ Register TagPrefix="Sample" TagName="Login" Src="~/mycontrol.ascx" %>  //声明控件引用

在这段代码中,有几个属性是必须编写的,这些属性的功能如下所示:
TagPrefix:定义控件位置的命名控件。有了命名空间的制约,就可以在同一个页面中使用不同功能的同名控件。
TagName:指向所用的控件的名字。
Src:用户控件的文件路径,可以为相对路径或绝对路径,但不能使用物理路径。

例1:博客园后台管理的顶部导航就可以通过一个用户控件来实现。

 新建WebUserControl.ascx,cs代码如下:

 

代码
using  System;
using  System.Collections;
using  System.Configuration;
using  System.Data;
using  System.Linq;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.HtmlControls;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Xml.Linq;

public   partial   class  Inc_WebUserControl : System.Web.UI.UserControl
{

    
private  String type  =   "" ; // 通过类型判断导航样式

    
public  String _type
    {
        
get  {  return  type; }
        
set  { type  =  value; }
    }

    
protected   void  Page_Load( object  sender, EventArgs e)
    {
                 
                Response.Write(_type);
     
       
    }
}

 

text_control.aspx页面html如下:

 

代码
<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " text_control.aspx.cs "  Inherits = " text_control "   %>



<% @ Register src = " Inc/WebUserControl.ascx "  tagname = " WebUserControl "  tagprefix = " uc1 "   %>

<! DOCTYPE html PUBLIC  " -//W3C//DTD XHTML 1.0 Transitional//EN "   " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >

< html xmlns = " http://www.w3.org/1999/xhtml " >
< head runat = " server " >
    
< title > 无标题页 </ title >
</ head >
< body >
    
    
< form id = " form1 "  runat = " server " >
    
< div >
      
    
</ div >

    
< uc1:WebUserControl ID = " WebUserControl1 "  runat = " server "  _type = "随笔 " />

    
</ form >
</ body >
</ html >

 

在不同页面拖入该控件后,设置不同的_type值,从而控制.ascx生成的html。

这里需要注意的是 页面Page_Load的执行顺序.

(1)文件包含 模板页,内容,用户控件

       先执行内容页Page_Load,再执行模板页 Page_Load,最后执行用户控件Page_Load

      当有多个不同的用户控件时候,内容页中靠前的用户控件Page_Load先执行。

 (2)文件为 只有 内容,用户控件

      先执行内容页Page_Load,再执行用户控件的Page_Load。

 2.自定义控件

    自定义控件与用户控件不同,自定义控件需要定义一个直接或间接从Control类派生的类,并重写Render方法。在.NET框架中,System.Web.UI.ControlSystem.Web.UI.WebControls.WebControl两个类是服务器控件的基类,并且定义了所有服务器控件共有的属性、方法和事件,其中最为重要的就是包括了控制控件执行生命周期的方法和事件,以及ID等共有属性。

    自定义控件又可以分为以下三种:

    (1).复合控件   将现有的各种控件组合起来,形成一个新的控件,来满足用户的需求
    (2).扩展控件   就是在现有的控件基础上,派生出一个新的控件,增加新的功能,或者修改原有功能,来满足用户需求
    (3).自定义控件  就是直接从System.Windows.Forms.Control类派生,也就是说完全由自己来设计、实现一个全新的控件,这是最灵活、最强大的方法,但是,对开发者的要求也是最高的。要实现一个自定义控件,必须为Control类的的OnPaint事件编写代码,在OnPaint事件中实现自定义控件的绘制工作。同时,还可以重写Control类的WndProc方法,来处理底层的Windows消息。所以说,要实现一个自定义控件,对开发者的要求较高,要求开发者必须了解GDI+和Windows API的知识。

 3.用户控件和自定义控件的异同

   对比用户控件和自定义控件,很多人或认为用户控件更加容易开发,而自定义控件的门槛较高,不方便应用程序的开发。其实不然,用户控件更适合创建内部的应用程序特定的控件,例如用户登录控件会在该项目中经常使用,所以创建用户控件能够极快的提高应用程序开发。而自定义控件通常应用到更适合创建通用的可再分发的控件,例如常用的开源HTML编辑器Fckeditor就可以说是一个优秀的自定义控件。

通常用户控件在一个项目中经常使用,而自定义控件用来在通用的程序中使用,当网站应用程序开发中,导航控件如果用用户控件实现,是非常方便的。但是通过自定义控件实现,可能并不能适合所有的应用场合,当需要适应其他场合时,可能需要重新开发和编译。具体的讲,用户控件和自定义控件可以从以下几个方面来说明它们的区别:

(1).使用率

在选择使用用户控件和自定义控件时,可以首先考虑使用率。如果开发的应用程序只是需要小范围的使用,则可以考虑用户控件,而如果开发的自定义控件能够在大部分的应用程序中被应用,则可以考虑自定义控件。

(2).创建技术

用户控件和自定义控件的创建技术是不相同的,并且用户控件和自定义控件创建的难度也不相同,用户控件是以.ascx形式声明并创建的,开发过程也比较简单,并且有设计器提供设计支持,而自定义控件是从System.Web.UI.Control派生而来的,开发过程稍微复杂,也没有设计器提供设计支持。

(3).生成方式

用户控件和自定义控件生成的方式不同,用户控件是以.ascx的形式呈现,而自定义控件是以DLL的形式呈现,通过添加引用,自定义控件能够在【工具箱】中显式,能够像服务器控件一样拖动到页面,并且能够通过编程开发增加自定义属性。而用户控件无法在工具箱显示,也不能够像自定义控件那样增加自定义属性。

(4).性能

虽然用户控件和自定义控件编写的过程不同,也遵循不同的创建模型,但是用户控件和自定义控件都是从System.Web.UI.Control直接或间接的派生的,在性能上没有很大的差别,主要是因为当用户控件在页面中第一次使用时,将作为普通的服务器控件被解析并编译进配件,第二次使用时,就和其他编译型控件一样。   

  

参考:1. 学习文档

        2. 测试代码

你可能感兴趣的:(asp.net)