在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
较之于asp,asp.net提供了更强大的功能,我比较喜欢它的代码分离技术和对诸如C#、VB.Net等强类型语言的使用,这是从开发者的角度来看的,从用户的角度来看,会觉得它速度更快,运行更稳定,安全性也更高。不管怎么说,新技术的产生总会使许多人感到高兴,不过对开发者来说,坏消息是他们需要学习更多新的知识。 Asp.net有了很多的改变,比如你可能会发现供我们操作的元素也和以前有了很大的不同,原来标准的HTML元素变成了现在的服务器控件,所谓服务器控件,就是在服务器上运行,并可以映射到所有浏览器支持的标准 HTML 标记的控件,在你的web窗体中,凡是包含 runat="server" 属性声明的元素都叫做服务器控件(在VS.Net中的设计页面中,用一个小小的绿色箭头表示),你可以用原有的HTML元素并加上runat=”server”属性使其变为一个服务器控件,这叫做HtmlControls,它可以直接映射到标准HTML标记;也可以使用.Net提供的全新的WebControls,它比前者更抽象,功能也更加强大。不管采用哪一类控件,runat=”server”属性都将会使你可以以编程方式访问这些元素。 这很容易理解,服务器控件就是在服务器端运行的控件,经过服务器端某些程序的解析再生成标准的HTML代码显示在我们的浏览器上,事实上,Web Form之所以可以提供最大可能的浏览器兼容性也是基于此理。与通常的理解稍稍有些不同,在asp.net中,一个页面(Page),一个验证控件,一个用户控件(User Control),都可以看作是一个独立的控件,它来自于其它控件的组合。除了使用.Net提供的一系列控件外,你还可以到网上找一些免费的控件,www.asp.net中的Control Gallery一栏就收集了很多常用的Control。 在asp.net中,(传统意义上)可供你开发的控件实际上有两种:Custom Control 和 User Control。Custom Control 是纵向的,是对系统本身控件的继承和扩充,在程序中以DLL文件形式存在,User Control 则是横向的,是对系统本身控件的组合,在系统中以.ascx为后缀名。这两种控件功能相同,都可以为开发人员提供可复用的可视化UI组件,相比之下前者具有更大的灵活性,同时开发起来比较复杂,而后者容易开发,但可重用性就比较差。一般来说用户会先用User Control来开发,只有当其不堪重用的时候才转而使用Custom Control。 事实上,用户自己开发Custom Control并不是一件很困难的事,只需要定义一个直接或间接从Control 派生的类并重写它的 Render 方法即可,System.Web.UI.Control与System.Web.UI.WebControls.WebControl两个类是服务器控件的基类。 Control 类定义了所有服务器控件共有的属性、方法和事件。其中包括控制控件执行生命周期的方法和事件,以及 ID、UniqueID、Parent、ViewState 和 Controls(子控件集合)等属性。Control 没有用户界面 (UI) 特定的任何功能。如果创作的控件没有提供 UI,或者组合了其他呈现其自己的 UI 的控件,则从 Control 派生。 WebControl 类是从 Control 派生的,并为 UI 功能提供附加的属性和方法。这些属性包括 ForeColor、BackColor、Font、BorderStyle、Height 和 Width。WebControl 是 ASP.NET 中 Web 服务器控件系列的基类。如果控件呈现 UI,则从 WebControl 派生。 可以重写从基类继承的属性、方法和事件,并可以将新的属性、方法和事件添加到自定义控件中,所前所述,我们使用重写Render方法来实现对HTML代码的输出。Render 方法采用 System.Web.UI.HtmlTextWriter 类型的参数。控件要发送到客户端的 HTML 作为字符串参数传递到 HtmlTextWriter 的 Write 方法。下面我们使用VS.Net来开发一个简单的自定义控件(使用VS.Net的原因是为了方便开发者调试,在正式开发中我们经常使用的也是VS.Net)。 首先新建一个空白解决方案,然后为其添加两个项目,一个名为MyControls的Web控件库项目和一个叫做Web的Web应用程序项目,后者用于测试我们开发出的控件。 在Web项目上点击右键,选择依赖项,使项目Web取决于MyControls,接着再为Web项目添加MyControls的引用(编译成的MyControls.dll文件后被copy到Web目录的Bin文件夹下,你可以在任何地方使用这个MyControls.dll文件)。 在MyControls项目中添加一个Web自定义控件并命名为MyControl.cs,接着在Web项目中的WebForm1.aspx文件首行添加如下代码(用于向页面注册此控件): <%@ Register TagPrefix="ccs" Namespace="MyControls" Assembly="MyControls" %> 在<Form>标记之间添加如下代码(添加此控件到页面上): <ccs:MyControl ></ccs:MyControl> OK,一个带有Text属性的自定义控件已经完成了,现在就可以运行它并观看效果了。 这个控件的结果仅仅是将一行文本输出到浏览器并显示出来,但是我们平时所用到的控件,小到如Label,大到如DataGrid,都是基于这一原理开发出来的。接着我们看一下这个自定义控件源文件(MyControl.cs)的组成。 using System; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; namespace MyControls { // Attribute DefaultProperty指定组件的默认属性,ToolboxData指定当从IDE工具中的 //工具箱中拖动自定义控件时为它生成的默认标记 [DefaultProperty("Text"), ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>")] //类MyControl派生自WebControl public class MyControl : System.Web.UI.WebControls.WebControl { private string text; //Attribute Bindable指定属性是否通常用于绑定 //Category指定属性或事件将显示在可视化设计器中的类别 //DefalutValue用于指定属性的默认值 [Bindable(true), Category("Appearance"), DefaultValue("")] public string Text { get { return text; } set { text = value; } } //重写WebControl的Render方法,采用HtmlTextWriter类型的参数 protected override void Render(HtmlTextWriter output) { //发送属性Text的值到浏览器 output.Write(Text); } } } 现在我们略略修改一下Render方法的输出值,试着为输出文本加上标签Span: output.Write("<span>"+Text+"</span>"); 也可以用标签修饰文本的显示: output.Write("<span><b>"+Text+"</b></span>"); 也可以添加更多的属性来控制文本的输出,在此基础上就可以创作出丰富的UI控件。 有时候针对不同的项目我们可能要开发不同用项的服务器控件,比如说特殊用途的DataGrid;有时候我们可能会被要求开发一些常用的控件,比如说像Chart、TreeView、Menu等这一类通用控件。针对于此,你可能会有四种不同的选择: 创建一个用户控件,用它封装其用户界面 (UI) 的服务器控件,无需编写任何额外的代码。 开发一个编译控件,该控件结合了两个或多个现有控件的功能。例如,需要一个封装一个按钮和一个文本框的控件。可以使用复合控件来完成。 从现有控件中派生并重写其属性、方法或事件来自定义现有控件。 从基本控件类之一派生来创建自定义控件。 以上四种方式从难度上来讲顺序依次复杂,使用原则如前所述,只有当前者达不到项目要求时才需考虑后者,一般来说,开发用户控件所使用的编程模型与后三个有着很大不同,它更类似于Asp.Net页的开发。 本文我们简单的描述了自定义控件的定义及使用情况,并且用VS.Net实际开发了一个(用于显示一串文本字段的)属于自己的自定义控件,你可以在自己的项目中使用它,也可以将其发布到互联网上供人们下载使用,当然现在控件MyControl所具的功能还不足以吸引用户去使用,接下来我们会讨论关于自定义控件的一些高级议题,包括定义属性、维护状态、处理回发数据、模版与数据绑定等内容以提高它的可用性。 |
请发表评论