ASP.NET教程之C#+ASP.NET 2.0定制复合组件之基本篇
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。asp.net 择要:在本系列文章中,我们起首会商利用ASP.NET2.0构建一个尺度ListBox控件的加强版本(EnhancedListBox)。这个控件可以对它的项举行重排序,而且可以完成客户端与服务器真个同步功效。然后,我们把如许的两个控件组合起来创立一个复合控件(ListMover)。1、弁言
构建供应丰厚的客户端接口的庞大Web控件常常必要把一些客户端JavaScript代码与控件的服务器端代码集成到一同。但是,在一些情形下,为了到达某种奇妙的效果而把成绩弄得过于庞大常常会损坏控件的外部服务器代码与天生的客户端HTML代码之间的数据同步,而当举行页面回寄时这将成为一个成绩。在本文中,我将起首构建两个“很酷”的Web控件(都极简单招致这一成绩),然后向你展现怎样来修正这一“懦弱性”。
本文中,我们将利用C#+ASP.NET2.0来定制这些控件,并在前面向你冗长先容怎样使之事情在ASP.NET1.1(或1.0)情况中。
以后,HTML仍旧坚持为Web使用程序天生阶段的次要言语。遗憾的是,它所利用的协定是无形态的,以是必需由Web开辟者本人来处置这类无形态特性。经由过程利用一些架构特性,比方回寄机制和ViewState变量,ASP.NET有助于处置这个成绩。但是,为了完成某些功效,还必要再作勉力,从而借助于回寄事务把Web页面不休向服务器收回哀求的各类手艺分离起来。
详细地说,我将剖析怎样利用JavaScript和DHTML存取在客户端天生的元素。实在,把客户端和服务器功效交融到一同请求利用大批的技能才干到达最好用户体验效果,而微软在其ASP.NET校验控件中就完成了这一点。为了供应一种丰厚的客户端校验效果,该控件中利用了大批的JavaScript。
作者注:本文假定你对定制Web控件开辟有一个基础懂得。因而,我将不再反复Web控件开辟的基本内容,比方属性事情道理与作风的增加体例。
2、一种惯例完成办法
上面,我想向你展现怎样构建一组很酷的控件,它们具有你在贸易控件中才干看到的优异功效。稍后,我将持续展现定制Web控件带给Web编程的完整封装长处。既然你已懂得怎样开辟定制Web控件,那末你应当晓得的一个观点是封装一个控件一切的功效和举动(就象你在一个尺度营业工具中所完成的那样)。在进修构建具有庞大举动的控件时,这类封装将极有效处。
在第一个控件中,我将向你展现怎样构建一个称为EnhancedListBox的控件。这个控件将扩大ASP.NET的ListBox控件―增加一个头部和一些重排序按钮。注重,这是一个间接承继自惯例ListBox的控件。
以后,我还将向你展现怎样构建一个复合控件―ListMover,它将包括两个下面提到的EnhancedListBox控件。这个ListMover控件还包括一些同意你从一个列表到另外一个列表中挪动项的按钮。
实在,用惯例办法(非面向Web控件的)来完成这类ASP.NET功效也其实不坚苦。起首,你要把一个惯例ListBox控件拖动到你的Web表单上而且利用一些数据添补它。
然后,再增加一个标签用作题目,另有一组按钮用作重排序按钮。捕捉这些按钮的服务器端事务是ASP.NET中的尺度操纵;因而,你只必要利用一种办法来获得以后选定的项而且依据用户点击的按钮从而把它放到该列表中的更高或更低的地位便可。比方,你大概编写以下的代码完成挪动列表中的一项。
i_Index=ListBox1.SelectedIndex;
o_Item=ListBox1.SelectedItem;
ListBox1.Items.RemoveAt(this.SelectedIndex);
i_Index--;
if(i_Index<0)i_Index=0;
ListBox1.Items.Insert(i_Index,o_Item);
上面,让我举行复杂的剖析。起首,我保留了以后的列表当选定项的索引值与以后项。然后,我在以后地位删除该项;以后,在一个较低地位(上一个索引值减1)从头拔出该项。这里的逻辑十分复杂,那末为何我还要申明这个成绩呢?
借助于这类惯例的ASP.NET编程办法,Web表单下面的重排序按钮将会激发一个完成ListBox中重排序的服务器端事务。这是由一个到服务器的回寄触发的;因而,这个回寄多是一次“沉重的”往复,详细要信任于表单上的详细内容及因特网速率。
但是,由于这一代码完成的是一个尺度ASP.NET回寄历程,以是由ASP.NET利用它的ViewState机制来卖力形态处置。当再次天生页面时,列表框内容按请求的按次准确天生。
固然,你也能够利用与此不异的惯例体例在ListMover控件中从头创立这个功效。篇幅所限,我在此省略,只好留待读者您来完成。这个Web表单上包括一对ListBox,另有一些唆使从左向右或从右向左挪动的按钮。这些按钮的服务器端事务将从一个ListBox中提取选择的项,然后把它增加到另外一个列表中;反之亦然。如在方才的例子中所展现的,ViewState在此可以无缺事情以坚持这两个ListBox中的项。
<P> 3、目标
上面,我想向你展现怎样把方才形貌的这些例子中所用的单个控件放到一个Web表单上。你大概猜出,我将向你展现怎样把这两个例子中的功效封装到它们本人的一个Web控件中。借助于与在惯例办法示例中形貌的不异的服务器端事务模子,我们能够把一切的举动封装到每个控件中来完成需要的功效。既然每个控件都可以把持它本人的形态,那末包括它们的Web表单不用要做任何分外的事情。
到今朝为止,统统顺遂。你大概问:“成绩在那里?”很好,假定页面开辟者在含有大批内容的页面上利用这两个控件,并且每当产生一次重排序或挪动,都必要到服务器真个重回寄时,这明显不是一个高效的Web站点要完成的。这恰是利用一些JavaScript的缘故原由。
在本例中,你要利用JavaScript代码来存取EnhancedListBox控件中ListBox的内容以便在客户端举行重排序。
在ListMover控件中,JavaScript代码将把项从一个列表挪动到另外一个列表。其终极了局是一样的,可是不必要举行服务器往返传送,由于不必要触发任何回寄。如许以来,你就能够办理立即呼应和不必要回馈的成绩。
4、成绩
ASP.NET在服务器端天生内容与在客户端天生内容之间有分明的界定。现实上,年夜部分情形下,这两部分没有干系;因而,成绩呈现了。实在,一个Web控件只是一个服务器端组件,它卖力把HTML天生到扫瞄器端。切实其实,尺度ASP.NETListBox控件恰是以HTML情势天生一个ListBox(作为一个<select>标签)。
在<select>标签中的<option>子标签可使用ListBox控件中的Item属性的内容来创立。Item属性在服务器端被添补,而其内容有助于在天生时代构建得当的HTML。这十分相似于天生一个<input>标签的文本框Web控件,而它的Text属性映照到<input>标签的Value属性。每当触发一个到服务器的页面回寄时,ListBox控件的Item属性都被保留到ViewState中,而且在从头天生页眼前从ViewState中举行重修。
在EnhancedListBox中举行重排序或在服务器真个ListMover中挪动项都十分间接,而且同意撑持一般的内置的ViewState机制而不必要我们作任何关扰。可是,当你利用客户端JavaScript增加这一才能来完成它们的功效时,它将损坏ViewState。这些控件其实不再转回到服务器端,以是Item汇合属性永久不会被保留以便在从头天生时被重载。代之的是,间接在HTML级别上存取天生的<select>标签中的<option>项。你能够借助JavaScript代码挪动或重排序控件项;可是,当在页面上再次产生回寄时,你猜产生了甚么?在挪动(或重排序)入手下手前,控件的列表项就恢复它们的形态。
我说过,假如功效产生在回寄时代的服务器端,那末,ViewState被保留而且被优秀重载,从而使Item汇合准确添补。可是,既然你的终极方针是在客户端完成这个功效,那末你就不再必要从头调剂Item属性的内容,而是由你依附的这个属性卖力形态存储。如今,你大概会难堪了。可是别忧虑―我有一个办理计划。如今,让我们入手下手利用需要的客户端剧本代码来开辟该控件来完成每个子控件所必要的功效。然后,我将向你展现怎样使它与服务器代码坚持从头同步。
5、EnhancedListBox控件
在这个控件中,你要把两部份内容增加到现有ASP.NETListBox控件。起首,增加一个头部―把一个标签放到一个ListBox的上方。然后,把两个按钮增加到ListBox―分离用于向下和向上重排序。
注重为了复杂起见,我在前面一切的代码形貌中省略一切的属性部分。
如今,创立一个承继自ListBox控件的新类,以下所示:
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
publicclassEnhancedListBox:ListBox
{}
假如你编译这部分代码而且把该控件增加到你的工具箱中,那末你将有一个完全功效的ASP.NETListBox控件正本。我把这个控件作为一个承继控件开辟,是由于我想使它具有一个ASP.NETListBox控件的“占位符”的感化。今后,我再增加别的的属性以完成头部的可见性并撑持重排序按钮的翻开或封闭。当这些属性全体封闭时,这些控件将在表面与举动上与一个惯例ListBox控件一样。但是,你不克不及利用一个重载的CreateChildControls把控件增加到其上,由于这个函数是用来构建一个控件条理树的。这个ASP.NETListBox控件被编写为一个天生控件并且间接把它的一切HTML内容绘制到天生引擎;如许以来,你必要在此处“注进”你的内容。你将利用天生控件办法来构建一个标签和两个按钮,而且经由过程重载Render办法来天生它们。但是,一旦你重载这个办法,你就完整作废了一切的在原始ListBox中的天生内容,而这是不成取的。因而,我想借助于一些小技能来完成。
<P> 6、代码注进
我的计划是,以一个尺度天生控件体例来绘制这个控件,个中包含table标签和该标签与我增加的按钮的天生体例等。当我编写天生显现部分时,也就是在我想注进承继的原始的ListBox的中央,我挪用了base.Render办法。这将把微软为ListBox控件编写的一切代码注进到我试图绘制的HTML部分(见源码中的列表1)。以下表格1中列出的属性决意了这部分代码的表面与举动。在本文中,我没有列出响应的属性代码,可是你能够鄙人载源代码中找到。注重,在代码中,你要天生的按钮将招致一个回寄(基于属性ReorderButtonPostback的值);而对接口IPostBackEventHandler的完成将捕捉这个回寄。
表格1:EnhancedListBox属性
属性名种别UpButtonCaptionAppearanceDownButtonCaptionAppearanceShowReorderButtonsAppearanceShowHeadingAppearanceHeadingCaptionAppearanceReorderButtonPostBackBehaviorSideButtonWidthLayoutSideButtonHeightLayoutSideButtonVerticalAlignLayoutReorderButtonSideLayoutUpButtonStyleStylesDownButtonStyleStylesListBoxStyleStylesHeadingStylesStyles
如今,既然该控件已看上往如你但愿的款式(见),那末你可让该按钮多卖力一些事情而不是仅激发一个回寄。终极的产物中包括事务处置代码;这部分代码位于接口IPostBackEventHandler的完成中,如许以来事务可以被有选择地向服务器引发,而另外一方面开辟者也能够在此处到场更多的代码。可是记着,你要利用这些按钮来重排序ListBox中的项,而且但愿在不实行回寄的情形下完成这一功效。如今,我们入手下手剖析最风趣的部分。
.EnhancedListBox控件让用户重排序一个列表中的项。
感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 那么,ASP.Net有哪些改进呢? 在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 主流网站开发语言之PHP:PHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。 最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
页:
[1]