这周末学习了 整理了控件开发的知识,顺便系统的整理下。
asp.net 中控件开发分为 用户控件开发和自定义控件开发。
1.用户控件
用户控件的后缀名为.ascx,用户控件是不能被用户直接访问的,只能嵌入到aspx页面中(设计模式下直接拖入)
<%@ Register TagPrefix="Sample" TagName="Login" Src="http://t.zoukankan.com/~/mycontrol.ascx" %> //声明控件引用
在这段代码中,有几个属性是必须编写的,这些属性的功能如下所示:
TagPrefix:定义控件位置的命名控件。有了命名空间的制约,就可以在同一个页面中使用不同功能的同名控件。
TagName:指向所用的控件的名字。
Src:用户控件的文件路径,可以为相对路径或绝对路径,但不能使用物理路径。
例1:博客园后台管理的顶部导航就可以通过一个用户控件来实现。
新建WebUserControl.ascx,cs代码如下:
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如下:
<%@ 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.Control与System.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. 测试代码