web控件开发系列(-)基础介绍
控件在WEB开发时经常要⽤到,虽然有部分已经存在⼯具箱⾥,但有时总需要根据⾃⼰的要求,开发⼀些
合适⾃⼰的控件。web控件开发已经成为WEB程序员必备的知识。
有过WEB开发的朋友都知道,建⽴⼀个WEB项⽬,Default页⾯显⽰的信息,好多⼈都会有Page_Load事件中
进⾏处理,这就对了。这个是Page页⾯的⽣命周期,控件也⼀样有⾃⼰的⽣命周期。当你了解⽣命周期后,
就不奇怪,为什么有部分代码要写在Page_Load事件中了。
⽣命周期⼤概有如下⼏个:
·实例化(Instantiate)
控件被页⾯或另⼀个控件通过调⽤它的构造器所实例化。这个步骤之后所列出的阶段,仅当控件加⼊控件树中才会发⽣。
·初始化(Initialize)
初始化在传⼊ Web 请求⽣命周期内所需的设置。在此阶段,控件树中的页⾯和全部控件通过默认⽅式来调⽤OnInit⽅法。开发⼈员可以通过重载OnInit⽅法,为控件提供初始化逻辑。在其⽣命周期的这个时候,控件能够安全地访问其置于Controls集合中的⼦控件,但是它不能访问控件层次中的⽗控件或其他层次更⾼的控件(如页⾯)
·开始跟踪视图状态(Begin Tracking View State)
这个阶段发⽣在初始化阶段的末尾。在此阶段页⾯⾃动调⽤TrackViewState⽅法。TrackViewState⽅法保证在此阶段之后,使⽤ViewState字典属性⽽产⽣的变化保存在控件视图状态中。在⼤多数情况下,Control基类提供的TrackViewState⽅法实现已经⾜够了,只有在控件定义了复杂属性时,才必须重载TrackViewState⽅法。
·加载视图状态(仅⽤于回传过程)(Load View State (postback only))
这个阶段发⽣在回传时,⽽不是初始请求过程中,在此阶段结束时,就会⾃动填充控件的 ViewState 属性控件可以重写 LoadViewState ⽅法的默认实现,以⾃定义状态还原。
·加载回传数据(仅⽤于回传过程,为可选项)(Load Postback Data(postback only, optional))
只有在控件通过实现IPostBackDataHandler接⼝参与了回传数据处理时,这个阶段才发⽣在回传中。TextBox控件就是⼀个例⼦。在这个阶段中,控件必须从已发送的表单数据中,通过实现IPostBackDataHandler接⼝的LoadPostData⽅法更新其状态。
·加载(Load)
直到此阶段开始,控件树中的所有控件都已被初始化,并恢复到它们在先前周期最后的状态。OnLoad⽅法会执⾏所有请求共有的操作,如设置数据库查询。此时,树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。如果需要实现仅在页⾯初始请求中执⾏的逻辑,那么实现该逻辑时,应该检查页⾯的IsPostBack属性
·引发修改事件(仅⽤于回传过程,为可选项)(Raise Changed Events(postback only, optional))
只有在控件通过实现IPostBackDataHandler接⼝参与了回传数据处理时,这个阶段才发⽣在回传中。在此阶段中,控件通过引发事件(如TextBox的TextChanged事件)作为⼀种信号-----其状态由于回传⽽改变(引发更改事件以响应当前和以前回发之间的状态更改)。为了参与此阶段,控件必须实现IPostBackDataHandler接⼝的RaisePostDataChangedEvent⽅法。
·引发回传事件(仅⽤于回传过程,为可选项)(Raise Postback Events(postback only, optional))
webserver接口开发只有在控件通过实现IPostBackEventHandler接⼝参与了回传数据处理时,这个阶段才发⽣在回传中。在此阶段可以通过实现IPostBackEventHandler接⼝的RaisePostBackEvent⽅法来实现逻辑,以便把客户端事件映射到服务器端事件。
·预⽣成(PreRender)
在此阶段中,应该通过重载OnPreRender⽅法,执⾏在⽣成控件之前所需要的任何⼯作。在⽣成输出之前执⾏任何更新,可以保存在预⽣成阶段对控件状态所做的更改,⽽在⽣成阶段所对应的更改则会丢失。
·保存视图状态(Save View State)
如果控件不维持状态,或者它为保存其所有状态信息⽽使⽤ViewState字典,那么不必在此阶段期间实现任何附加逻辑。在此阶段期间,页⾯框架会⾃动保存ViewState字典。如果需要⾃定义状态管理,必须通过重载SaveViewState⽅法来实现⾃定义状态恢复,这种⽅法只被EnableViewState属性为true的控件所调⽤。在此阶段以后任何控件的改变都不会保存在控件的视图状态中。
·⽣成(Render)
通过这种⽅法,控件在输出流上通过重载Control的Render⽅法或WebControl类的rendering⽅法中的
⼀种,来写标记⽂本。
·卸载(Unload)
在此阶段中,页⾯通过实现Page_Unload⽅法,来执⾏清除⼯作。作为控件开发者,应该重载Dispose⽅法来执⾏清除。
·释放(Dispose)
在此阶段,应该重载Dispose⽅法来释放控件所占的全部资源。
⼤概理解⼀下就可以了,不必要⽣记硬背。应该你以后开发过程中会慢慢深⼊掌握,现在背出来的概念也没什么作⽤的。
到这⾥,是否应该介绍⼀下控件开发的步骤了呢?
第⼀:通过VS2008创建⼀个空的解决⽅案(ControlRewrite)
第⼆:在解决⽅案下添加⼀个ASP.NET服务器控件项⽬(ServerControl)
第三:在解决⽅案下添加⼀个ASP.NET应⽤程序(WebApp)
如下图:
第四:在ServerControl添加⼀个类,命名为UserLabel输⼊下⾯代码:
先在SererControl项⽬添加System.Web引⽤,右键项⽬,选添加引⽤,弹出对话框中选择。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ServerControl
{
public class UserLabel : WebControl
{
private Label myLabel;
[Description("标签⽂本")]
public string labeltext
{
get
{
//确定这个控件存在,如果不存在的,就会创建⼦控件
//其实看注释你只要把⿏标放到⽬标名称上,就看出现功能的注释,想看类的构成,点右键, 转到定义就可以看到类构成部分了this.EnsureChildControls();
Label.Text;
}
set
{
this.EnsureChildControls();
}
}
[Description("标签长度")]
public Unit labelWidth //注意控件的长度与⾼度都是Unit类型(看下⼀个注释查看的⽅法)
{
get
{
this.EnsureChildControls();
Label.Width; //⿏标放在Width上⾯可以看到Unit WebControl.Width, }
set
{
this.EnsureChildControls();
}
}
[Description("标签⾼度")]
public Unit labelHeight
{
get
{
this.EnsureChildControls();
Label.Height;
}
set
{
this.EnsureChildControls();
}
}
//当然你在这⾥还可以定义好多属性,例如颜⾊,背景,字体⼤⼩等等
///<summary>
/// 这⾥创建⼦控件
///</summary>
protected override void CreateChildControls()
{
this.Controls.Clear(); //清除所以控件
this.Controls.Label);
}
///<summary>
/// 这⾥输出
///</summary>
///<param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
}
}
}
编译⼀下这个类,如果没问题的就成功了,如果有问题的请
打WebApp的default.aspx页⾯,如果没有这个页⾯,请⾃⾏创建⼀个。
在⼯具箱⾥可以到⼀个叫ServerContorl的选项卡,把UserLabel拖到页⾯上。
或在源代码中输⼊下⾯的代码:
<%@ Register assembly="ServerControl"namespace="ServerControl" tagprefix="cc1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<cc1:UserLabel ID="WebControl1" runat="server" labeltext="WebControl1"/>
</div>
</form>
</body>
</html>
到设计状态下你就可以看到你⾃⼰定义的控件了。这只是⼀个介绍WEB控件的例⼦,⼗分简单,但可以开发出⼗分复杂庞⼤的控件,像博客园你发布⽂章这样的控件,或电⼦购物⽹的商品展⽰控件等等。我在⼀个项⽬中⼯发的⼀个绑定XML XSL产⽣HTML的控件也⼗分复杂。不过⽤起来简单,⽅便以后使⽤。
下篇介绍控件⽣命周期,通过代码展⽰,控件⽣成的步骤。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论