ASP.NET组件设计Step by Step(1-3)

转自CSDNBlog  之cashcho的专栏 


学习创建工程库、在自己的项目中应用 

1、  启动VS200X 

2、  选择新建解决方案 

3、  选择缺省的方案型,选择 Web控件库。Web控件库不需要web站点,基本上是一个DLL型库 

4、  输入自己的型库的名称,譬如ASPCTLLib之的。这个决定了namespace和以后其他工程使用此库的引用库名。 

5、  系统自动产生的代码如下: 

using System; 

using System.Web.UI; 

using System.Web.UI.WebControls; 

using System.ComponentModel; 

  

namespace ASPCtlLib 



     /// <summary> 

     /// WebCustomControl1 的摘要说明。 

     /// </summary> 

     [DefaultProperty("Text"), 

          ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")] 

     public class WebCustomControl1 : System.Web.UI.WebControls.WebControl 

     { 

          private string text; 

          [Bindable(true), 

              Category("Appearance"), 

              DefaultValue("")] 

         public string Text 

         { 

              get 

              { 

                   return text; 

              } 

              set 

              { 

                   text = value; 

              } 

         } 

  

         /// <summary> 

         /// 将此控件呈现给指定的输出参数。 

         /// </summary> 

         /// <param name="output"> 要写出到的 HTML 编写器 </param> 

          protected override void Render(HtmlTextWriter output) 

         { 

              output.Write(Text); 

         } 

     } 




 


6、  AssemblyInfo.cs的介绍 

7、  编译此工程得到ASPCTLLIb.dll 

8、  其他项目引用 

  

如何引用自己建立的Web控件库 

1、  打开/新建一个asp.net项目 

2、  引用ASPCTLLib.dll,将会在引用中出现aspctllib,同时将之前的dll文件复制到当前工程的目录 

3、  将自己的Web控件库中控件加入toolbar的选项卡:右击选项卡,自定义工具箱,选择.net框架组件,浏览,找到aspctllib.dll加入,即可看到名为WebCustomControl1的组件存在于工具箱 

4、  打开自己的aps.net web 项目,选择一个web窗体,可以将自己的控件加入到其中。缺省的设计时此控件会显示:[WebCustomControl1 ” WebCustomControl1”]。 

5、  选中窗体中的此控件,打开属性进行编辑,基本上缺省的设计控件仅有一个Text属性属于定制属性,输入特定文字。 

-------------------------------------------------------------------------------
ASP.NET组件设计(2)  
从继承关系上看,Asp.net 服务器控件的别大致上分为4: 

1、  用户控件 

似page,基本上不需要编程,可以将某个aspx页面作为复用组件使用。 

  

2、  LiteralControl 

ASP.NET 将所有不需要服务器端处理的 HTML 元素和可读文本编译为该的实例。例如,开始标记中不包含 runat="server" 属性/值对的 HTML 元素被编译为 LiteralControl 对象。 

文本控件的行为与文本容纳器一样,这意味着可以从文本控件提取文本,并通过父服务器控件的 Controls 属性从父服务器控件的 ControlCollection 中移除文本控件。因此,当开发从 LiteralControl 导出的自定义控件时,确保由控件自己执行任何所需的预处理步骤,而不是使用对 LiteralControl.Render 方法调用的调用来实现它们。一般都会这样做以提高 Web 应用程序的响应时间。 

LiteralControl一般不会触发服务器端事件。 

可以以编程方式分别使用 ControlCollection.Add 或 ControlCollection.Remove 方法,从页或服务器控件添加或移除文本控件。 

  

3、  HtmlControl 

HTML元素的asp.net模型服务器端对应组件。每一个HtmlControl直接对应于特定的HTML元素(不一定是输入元素)。 

4、  WebControl 

通常的Web控件。可以理解为属于复杂的HTML元素以及服务器端处理逻辑组成的。 

  

继承关系图: 

System.Object 

   System.Web.UI.Control 

        System.Web.UI.TemplateControl 

               System.Web.UI.Page 

        System.Web.UI.UserControl 

        System.Web.UI.LiteralControl 

        System.Web.UI.HtmlControl 

        System.Web.UI.WebControl 

  

通常需要程序员开发的属于用户控件、web控件。xxx 

从WebControl继承而来的web服务器组件,往往继承了丰富的UI元素和控制能力。 

  

用户控件 

1、  为什么是用户控件 

现代人喜好偷懒,喜欢“所见即所得”以及“拖放”式的编程。在一个阿asp.net web项目中往往会在多个页面中存在共用的UI,譬如header footer等,如果所有页面的内容都一致,往往采用包含特定的js文件来实现,但如果这些多个页面都需要的UI部分跟随不同的用户状态等不同而会不同,这是必须采用动态逻辑处理,普通的js/html就无法满足要求。之前asp中采用include asp文件来实现,现在asp.net改变了包含asp文件的种种缺限而采用用户控件来解决。 

用户控件本质上是一个独立的asp.net文件,扩展名为ascx。用户控件通常依赖于特定的asp.net web项目。当使用用户控件时,asp.net页面解析器从aspx文件中动态生成一个,将其编译到一个特定的装配件(临时缓存中托管dll),并按照.net方式引用此实例,并进行处理。 

  

  

2、  如何得到用户控件 

得到用户控件,在vs中实际上仅需要: 

在web项目中添加—〉用户控件—〉输入用户控件名—〉在得到的空白页面进行UI设计,并存储。 

使用时,将用户控件拖放在web 窗体上,即可使用用户控件。此时vs替代我们做了一下工作: 

在使用用户控件的页面添加一个register指令。具体为: 

<%@ Register TagPrefix="uc1" TagName="WebUserControl1" Src="WebUserControl1.ascx" %> 对于页面解释器可解释为:将<uc1: WebUserControl1 作为用户控件来解释,uc1为标签前缀(似标准web控件的asp标签前缀),WebUserControl1作为此用户控件的标签,遇到这一组合就解释为使用用户控件实例。Src值为该用户控件源文件所在的虚拟路径,但不可以为绝对路径。 

  

3、  用户控件的实质(asp.net的用户控件的背景) 

asp.net是编译的,处理用户控件同处理页面是似的,页面中所有元素都是编译成特定被asp.net页面调用、触发事件的。用户控件也是通过此途径被复用的。当处理用户控件时,页面框架执行以下步骤: 

解释ascx文件,相应解释成为一个派生于System.Web.UI.UserControl的托管 

动态编译到自动生成的装配件中。 

以上过程仅在第一次使用用户控件时发生,以后复用此用户控件会省略此步骤。页面使用register指令,将会引用此。页面中的用户控件会成为此的实例。实际上用户控件也是编写asp.net,派生于System.Web.UI.UserControl的,页面使用这些如同使用ASP.net的标准,为以不同在于标准控件内置可直接实例化使用,而用户控件需要在使用前进行似页面的编译工作,编译得到并组装到装配件后可以被实例化。 

  

4、  用户控件编程注意事项 

用户组件不可以通过new方式实例化,因为用户控件属于动态生成,new的时候(这个时候应当是页面编译时候,用户控件还没有被运行使用),用户控件还不存在。但是可以通过Page.LoadControl(string controlname)来装载,此时为了loadControl可以找到用户控件,需要采用refence指令:<%@ Refence Control=”xxx/UserControlSamples.ascx”%> 。 

用户控件可以被另外用户控件嵌套使用,但一定要确保用户控件引用位置正确。 

用户控件本身属于UI,可以被缓存,通过ascx文件顶端的OutPutCache指令来确定。  
        用户控件代码中到的URL是指用户控件存在的路径,而不是调用用户控件的页面代码的路径,需要通过Page.ResolveUrl进行正确的解析。 

-------------------------------------------------------------------------------------

ASP.NET组件设计(3) 

自定义控件(custom control)入门 

在服务器端中执行程序逻辑的组件,是asp.net 应用程序的基本构造块。为了能够在asp.net环境执行,必须满足一定条件。 

        为了能够参与到网页框架执行,需要满足IComponent, IDisposable, IParserAccessor,   IdataBindingsAccessor等接口。所以框架提供System.Web.Control供控件开发者继承。 

IComponent     提供组件所需的基本功能,接口实现为: 

        { 

        ISite Site {get; set;}//提供站点接口,组件可以通过此接口访问容器 

        event EventHandler Disposed;        //事件 

} 如果实现了此接口,就成为可设计组件,可加入到可视化设计器工具箱,能够脱放到页面(Isite接口)中,属性浏览器中显示属性。 

IDisposable  接口实现组件自身资源释放(Icomponent实际上继承自IDisposable  ) 

IParserAccessor 该接口规定AddParsedSubObject(object obj)方法用于通知服务器控件已分析元素(XML 或 HTML)。分析元素时,元素被识别为实现该接口的服务器控件的子级。这些元素将被转换为对象。实现该接口时,所创建的控件在被通知已分析元素后立即定义要发生的处理。 

IDataBindingsAccessor 接口允许在设计时访问控件的数据绑定表达式集合。 



       DataBindingCollection DataBindings {get;}// 指示控件的所有数据绑定的集合。此属性为只读。 

bool HasDataBindings {get;} //返回控件是否包含任何数据绑定逻辑。 



  

       继承自Control的WebControl为表现HTML(毕竟最后用户看到的是HTML)而在Control中加入了一些新的功能,如样式、字体、背景、前景。。。 

  

Control的定义: 

       公共属性: 

ClientID 获取由 ASP.NET 生成的服务器控件标识符。  

Controls 获取 ControlCollection 对象,该对象表示 UI 层次结构中指定服务器控件的子控件。  

EnableViewState 获取或设置一个值,该值指示服务器控件是否向发出请求的客户端保持自己的视图状态以及它所包含的任何子控件的视图状态。  

ID 获取或设置分配给服务器控件的编程标识符。  

NamingContainer 获取对服务器控件的命名容器的引用,此引用创建唯一的命名空间,以区分具有相同 Control.ID 属性值的服务器控件。  

Page 获取对包含服务器控件的 Page 实例的引用。  

Parent 获取对页 UI 层次结构中服务器控件的父控件的引用。  

Site 获取有关服务器控件所属 Web 站点的信息(原文自MSDN,但是我认为不对,应该是指组件的“容器”站点,并非 web site)。  

TemplateSourceDirectory 获取包含当前服务器控件的 Page 或 UserControl 的虚拟目录。  

UniqueID 获取服务器控件的唯一的、以分层形式限定的标识符。  

Visible 获取或设置一个值,该值指示服务器控件是否作为 UI 呈现在页上。 

  

公共方法 

DataBind 将数据源绑定到被调用的服务器控件及其所有子控件。  

Dispose 使服务器控件得以在从内存中释放之前执行最后的清理操作。  

Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。  

FindControl 已重载。在当前的命名容器中搜索指定的服务器控件。  

GetHashCode(从 Object 继承) 用作特定型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。  

GetType(从 Object 继承) 获取当前实例的 Type。  

HasControls 确定服务器控件是否包含任何子控件。  

RenderControl 将服务器控件的内容输出到所提供的 HtmlTextWriter 对象中;如果已启用跟踪功能,则存储有关控件的跟踪信息。  

ResolveUrl 根据传递给 TemplateSourceDirectory 属性的值,将相对 URL 解析为绝对 URL。  

ToString(从 Object 继承) 返回表示当前 Object 的 String。 

  

       公共事件 

DataBinding 当服务器控件绑定到数据源时发生。  

Disposed 当从内存释放服务器控件时发生,这是请求 ASP.NET 页时服务器控件生存期的最后阶段。  

Init 当服务器控件初始化时发生;初始化是控件生存期的第一步。服务器控件应执行任何创建和设置实例所需的初始化步骤。在该事件内无法使用视图状态信息;它尚未填充。在该事件的生存期内不应访问其他服务器控件,不论它是此控件的子级还是父级。不一定会创建其他服务器控件,也不一定能够访问它们。 

Load 当服务器控件加载到 Page 对象中时发生。通知服务器控件执行任何设置为在每次页请求时发生的处理步骤。开发者可以访问视图状态信息并利用该事件形成 POST 数据。还可以访问页控件层次结构内的其他服务器控件。 

PreRender 当服务器控件将要呈现给其包含的 Page 对象时发生。使用该事件在服务器控件呈现给页的输出之前执行任何更新。在该事件的生存期内可以保存服务器控件视图状态的任何更改。不保存呈现阶段内所做的同样更改。 

Unload 当服务器控件从内存中卸载时发生。 

  

              受保护的属性和方法有: 

              保护的属性 

ChildControlsCreated 获取一个值,该值指示是否已创建服务器控件的子控件。  

Context 为当前 Web 请求获取与服务器控件关联的 HttpContext 对象。  

Events 获取控件的事件处理程序委托列表。此属性为只读。  

HasChildViewState 获取一个值,该值指示当前服务器控件的子控件是否具有任何已保存的视图状态设置。  

IsTrackingViewState 获取一个值,该值指示服务器控件是否将更改保存到其视图状态。  

ViewState 获取状态信息的字典,这些信息使您可以在同一页的多个请求间保存和还原服务器控件的视图状态。  

ViewStateIgnoresCase 获取一个值,该值指示 StateBag 对象是否不区分大小写。  

受保护的方法 

AddParsedSubObject 通知服务器控件某个元素(XML 或 HTML)已经过语法分析,并将该元素添加到服务器控件的 ControlCollection 对象。  

ClearChildViewState 删除服务器控件的所有子控件的视图状态信息。  

CreateChildControls 通知使用基于合成的实现的服务器控件创建它们包含的任何子控件,以便为回发或呈现做准备。  

CreateControlCollection 创建一个新的 ControlCollection 对象来保存服务器控件的子控件(包括文本控件和服务器控件)。  

EnsureChildControls 确定服务器控件是否包含子控件。如果不包含,则创建子控件。  

Finalize(从 Object 继承) 已重写。允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。  

IsLiteralContent 确定服务器控件是否只包含文字内容。Asp.net页面中普通的html标签被asp.net编译为一个 LiteralContent控件(意味着轻型控件)。 

LoadViewState 从 SaveViewState 方法保存的上一个页请求还原视图状态信息。  

MapPathSecure 如果请求服务器控件有足够的安全权限读取映射结果,检索相对于源文件的映射物理文件路径。  

MemberwiseClone(从 Object 继承) 创建当前 Object 的浅表副本。  

OnBubbleEvent 确定服务器控件的事件是否沿页的 UI 服务器控件层次结构向上传递。  

OnDataBinding 引发 DataBinding 事件。  

OnInit 引发 Init 事件。  

OnLoad 引发 Load 事件。  

OnPreRender 引发 PreRender 事件。  

OnUnload 引发 Unload 事件。 注意   在服务器控件生存期的此阶段,服务器控件应执行所有最后的清理操作,例如关闭文件、关闭数据库连接和丢弃对象。  

RaiseBubbleEvent 将所有事件源及其信息分配给控件的父级。  

Render 将服务器控件内容发送到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。  

RenderChildren 将服务器控件子级的内容输出到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。  

SaveViewState 保存自页回发到服务器后发生的任何服务器控件视图状态更改。  

TrackViewState 导致跟踪服务器控件的视图状态的更改,以便这些更改可以存储到服务器控件的 StateBag 对象中。通过 Control.ViewState 属性可访问此对象。 
posted on 2006-03-20 14:11  球艺  阅读(640)  评论(0编辑  收藏  举报