ASP.Net中程序构架与程序代码的分离_第1页
ASP.Net中程序构架与程序代码的分离_第2页
ASP.Net中程序构架与程序代码的分离_第3页
ASP.Net中程序构架与程序代码的分离_第4页
ASP.Net中程序构架与程序代码的分离_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ASP.Net中程序构架与程序代码的别离一年前,当本人拿到一个名叫TIG的PHP程序时,立即被作者P编程思想所折服,很难想像TIG中所有的功能行事历、邮件、个性化均在一个PHP文件(index.php3)中执行完成,这就得益于作者采用了程序代码与页面构架别离的思想,但是我也看到尽管作者做了很大的努力,但由于PHP的局限性,程序并没有真正做到代码与构架的别离,index.php3这个主文件由于要执行的功能太多,所以其require的模块文件相当之多,至使整个文件仍然显得非常零乱,本人愚昧,当时花了半个月的时间,才真正明白程序的构架,分析代码之苦,无人能知啊(黯然泪下)。TIG程序对我此后的编程有

2、着很大的影响,但是即使这样的作品,仍然没有摆脱程序代码与HTL代码混杂的场面。程序代码与页面构架的别离是EB程序员多年的梦想。在ASP.Net出现之前,无论是ASP、PHP还是JSP,程序代码与HTL代码都是混杂在一起的,这种做法,虽然在EB技术初期受到赞扬,但是随着时间的的推移,它的弊端是越来越明显,当程序代码很长时,HTL代码与其混杂,程序的可读性变得很差,让人无法分清程序真正要表示的页面构架。而新技术ASP.Net那么通过debehind、用户控件(Userntrl)以及自定义控件(ustntrl)等方法真正做到了代码的别离。这是一个了不起的进步,大家可以在本文中看到别离代码后的ASP.

3、Net程序的构造是多么的明晰。为了便于理解,这里设计的页面比拟简单,页面分为三个主要的局部,头部包含一个AdRtatr控件(用于显示广告)与一个Label控件(用于显示当前广告链接地址);中部是一个登陆页面,包括两个TextBx控件(分别用于输入用户名与密码)、一个Label控件(显示登陆是否成功)与一个Buttn控件(作为提交按钮);底部包含两个Label控件(分别显示当前用户名与用户权限)。熟悉ASP.Net的朋友,马上就会意识到头部由于使用了AdRtatr控件,所以必定存在nAdreated事件以便在Label控件显示相应链接;而中部由于使用Buttn控件做为提交按钮,所以必定有一个nl

4、ik事件处理。1deBehind首先我们就看看如何使用deBehind方法来实现代码与页面构架的别离,下面给出的源程序是主ASP.Net程序-Exaple1.aspx:%PageSr=sEventHandle.sInherits=Aspn%htlheadtitle/title/headbdyfrrunat=serverasp:Panelid=Headerrunat=serverasp:AdRtatrid=adAdvertiseentFile=AdBannersad.xlBrderidth=0nAdreated=Adreatedrunat=server/br当前广告链接:asp:Labelid=

5、lblAdTextFrelr=redrunat=server/asp:Panelasp:Panelid=Lgnrunat=servertabletrtdlspan=2align=enterb登陆窗口/b/td/trtrtdlspan=2align=enterasp:Labelid=lblsgShFrelr=redrunat=server/td/trtrtd用户名:/tdtdasp:TextBxid=tbUserNaerunat=server/td/trtrtd密码:/tdtdasp:TextBxid=tbPassdTextde=Passrdrunat=server/td/trtrtdasp:B

6、uttnid=btnSubitText=登陆nlik=Subit_likrunat=server/td/tr/table/asp:Panelasp:Panelid=Fterrunat=server用户名:asp:Labelid=lblUserNaeFnt-Nae=ArialFrelr=redText=游客runat=server/权限:asp:Labelid=lblPurvieFnt-Nae=ArialText=无Frelr=redrunat=server/asp:Panel/fr/bdy/htl例程中,大家可以清楚地看到程序中不包含任何#、VB、JavaSript来处理nAdreated与n

7、lik事件,但是执行本程序,程序可以正常使用(如图2-1与图2-2)。这便是使用deBehinde的结果,事件处理已经被转移到其它程序中定义执行。请大家注意本例中第一行的信息:%PageSr=sEventHandle.sInherits=Aspn%一般在ASP.Net程序中,Page指令都在设定本程序应当使用什么语言(使用Language属性),而本例中没有出现Language属性,而是出现了两个新的Page属性:Sr与Inherits。Sr属性设定事件处理真正的代码位置,Inherits属性那么设定需要引入的类名。可以看到本例中定义事件处理的文件是EventHandle.s,我们来看看它的详

8、细内容:usingSyste;usingSyste.Data;usingSyste.Data.Sqllient;usingSyste.eb;usingSyste.eb.UI;usingSyste.eb.UI.ebntrls;usingSyste.eb.UI.Htlntrls;publilassAspn:Page/声明ebFr中出现的控件publiLabellblAdText,lblUserNae,lblPurvie,lblsgSh;publiTextBxtbUserNae,tbPassd;publiButtnbtnSubit;publiAdRtatrad;privatestringstrnnS

9、tring=server=(lal)FEida;database=aspn;Trusted_nnetin=yes;/处理Adrtatr控件建立事件publividAdreated(bjetsr,AdreatedEventArgse)lblAdText.Text=e.AlternateText;publividSubit_lik(bjetsender,EventArgse)Sqlnnetinynn=neSqlnnetin(strnnString);ynn.pen();stringstrUserNae,strPassrd,strSelet;strUserNae=tbUserNae.Text;str

10、Passrd=tbPassd.Text;strSelet=selet*frbbs_userhereid=+strUserNae+andpassrd=+strPassrd+;Sqlandy=neSqland(strSelet,ynn);SqlDataReaderdr=y.ExeuteReader();if(dr.Read()/登陆成功lblsgSh.Text=登陆成功;lblUserNae.Text=drid.TString();lblPurvie.Text=drpurvie.TString();else/登陆不成功lblsgSh.Text=登陆不成功;dr.lse();ynn.lse();进展

11、事件处理是定义在一个类中的(本例中是Aspn,注意大小写),由于需要与ebFrs相关联,所以此类还必须继承Page类。分析程序,大家可以看到程序中对事件的处理操作是与普通的未进展代码别离的程序是一样的,并没有什么特别的地方。(本人在程序中已经给出的相关注释,相信对大家理解程序有所帮助)使用deBehind技术后,大家需要多写一些代码,比方声明控件等,也许大家很不喜欢多写这样的代码,但是大家也必须看到使用了deBehind技术后,主程序的可读性大大增加了。在Exaple1.aspx中相信大家很快就可以区分页面构架的各个局部,大家想想这些构架假如在其它技术是否能看得如此清楚?(这里的程序只做演示用

12、,呵呵,大家可不要抓我什么引号破绽这些小辫子哟)2用户控件(Userntrl)deBehind技术真正实现了代码与构架的别离,比以前的技术前进了一大步,但是它的缺陷也是显而易见的,比方主页面中部那个登陆区,假如内容很多,HTL显示代码的仍然会占用很大的区域,程序的可读性仍然会降低。ASP.Net也提供理解决方法,这就是用户控件。用户控件我们可以将其视为不用编译的Server控件。即然是控件,那么就肯定会遵从控件的使用方法。我们将Exaple1.aspx中的每个Panel整体看成为一个控件,因此Exaple1.aspx的主体局部通过使用用户控件便可以减少为只有三行:%RegisterTagPre

13、fix=aspnTagNae=HeaderSr=Userntrls/Header.asx%RegisterTagPrefix=aspnTagNae=LgnSr=Userntrls/Lgn.asx%RegisterTagPrefix=aspnTagNae=FterSr=Userntrls/Fter.asx%htlheadtitle/title/headbdyfrrunat=serveraspn:Headerid=yHeaderrunat=server/aspn:Lgnid=yLgnrunat=server/aspn:Fterid=yFterrunat=server/fr/bdy/htl执行这个程

14、序,其运行结果与使用deBehind技术的结果是一样的,但是如今的ASP.Net程序更加容易区分页面构架了。aspn:Headerid=yHeaderrunat=server/aspn:Lgnid=yLgnrunat=server/aspn:Fterid=yFterrunat=server/这三行代码,使用了三个用户控件,这么少的代码大家一眼就可以清楚的看到页面被分为三个局部。要使用用户控件就必须使用Register指令,TagPrefix属性定义是的一个Naespae的名字,以保证它在这个页面的唯一性;TagNae属性是在定义一个类(lass)的别名,由于用户控件执行时是被LR编译成为类来执

15、行的,所以就必须给本程序中每个用户控件一个唯一的名字,以便于大家区分;Sr属性那么是详细指出了使用的用户控件的文件名(用户控件均以.asx结尾)。用户控件的使用与普通Server控件一样:naespae:lass.runat=server/naespae表示定义的命名空间,lass那么是相应的类名,详细的使用例子有:aspn:Lgnid=yLgnrunat=server/下面是用户控件显示程序中所使用的用户控件的详细内容:Header.asx(Header用户控件)SriptLanguage=#Runat=ServerprivatevidAdreated(bjetsr,AdreatedEven

16、tArgse)lblAdText.Text=e.AlternateText;/sriptasp:AdRtatrid=adAdvertiseentFile=.AdBannersad.xlBrderidth=0nAdreated=Adreatedrunat=server/br当前广告链接:asp:Labelid=lblAdTextFrelr=redrunat=server/Lgn.asx(Lgn用户控件)%IprtNaespae=Syste.Data%IprtNaespae=Syste.Data.Sqllient%SriptLanguage=#Runat=Serverprtetedstringst

17、rnnString=server=(lal)Feida;database=aspn;Trusted_nnetin=yes;/定义Userntrl的属性publistringUserNaegetreturntbUserNae.Text;settbUserNae.Text=value;publistringPassrdgetreturntbPassd.Text;settbPassd.Text=value;/事件处理privatevidSubit_lik(bjetsender,EventArgse)Sqlnnetinynn=neSqlnnetin(strnnString);ynn.pen();str

18、ingstrUserNae,strPassrd,strSelet;strUserNae=tbUserNae.Text;strPassrd=tbPassd.Text;strSelet=selet*frbbs_userhereid=+strUserNae+andpassrd=+strPassrd+;Sqlandy=neSqland(strSelet,ynn);SqlDataReaderdr=y.ExeuteReader();if(dr.Read()/登陆成功lblsgSh.Text=登陆成功;SessinUserNae=drid.TString();SessinPurvie=drpurvie.TS

19、tring();else/登陆不成功lblsgSh.Text=登陆不成功;dr.lse();ynn.lse();/sripttabletrtdlspan=2align=enterb登陆窗口/b/td/trtrtdlspan=2align=enterasp:Labelid=lblsgShFrelr=redrunat=server/td/trtrtd用户名:/tdtdasp:TextBxid=tbUserNaerunat=server/td/trtrtd密码:/tdtdasp:TextBxid=tbPassdTextde=Passrdrunat=server/td/trtrtdasp:Buttni

20、d=btnSubitText=登陆nlik=Subit_likrunat=server/td/tr/tableFter.asx(Fter用户控件)SriptLanguage=#Runat=ServerprivatevidPage_Lad(bjetsr,EventArgse)if(SessinUserNae!=null)lblUserNae.Text=(string)SessinUserNae;lblPurvie.Text=(string)SessinPurvie;/sript用户名:asp:Labelid=lblUserNaeFnt-Nae=ArialFrelr=redText=游客runat

21、=server/权限:asp:Labelid=lblPurvieFnt-Nae=ArialText=无Frelr=redrunat=server/每个控件包含有自已的显示代码以及相应的程序代码。我们可以将一些常用的功能制作成为固定的用户控件,当需要时,我们就可直接拿来使用,而不需要使用烦人的rtl+,trl+V来复制、粘贴长长的一大堆代码。用户控件不仅做到了程序代码与页面构架的别离,而且还增加了代码重用性。3自定义控件(ustntrl)用户控件是很不错的选择,但是由于每个用户控件都是一个asx文件,当这些控件很多时,它们的使用就显得比拟零乱。此时我们便想可不可以将一些比拟相似的控件整合起来,在

22、程序中只需要引用一次,便全部搞定。这是个很不错的想法,我们把这个想法说得更加专业一些:将多个类(lass)导入同一个命名空间(naespae)。呵呵,怎么样,这句话是不是有点有耳熟?大家快去查一查Server控件的定义,是不是发现这句话是.我们下面就要接触如何写Server控件。编写Server控件并不是一件轻松容易的事情,需要对.Net平台有比拟深的理解,合适于高级用户,因此这里本人也不会详细描绘Server控件的编写步骤(要细细讲这个,非得写书不可)。请大家比拟一下自定义控件源代码与用户控件的区别,作一些大致的理解:usingSyste;usingSyste.Data;usingSyste

23、.Data.Sqllient;usingSyste.Draing;usingSyste.eb;usingSyste.eb.UI;usingSyste.eb.UI.ebntrls;naespaeaspn/首先是HeaderpublilassHeader:ntrl,INaingntainerprivateAdRtatrad;privateLabellblAdText;prtetedverridevidreatehildntrls()/参加AdRtatr广告控件ad=neAdRtatr();ad.AdvertiseentFile=AdBanners/ad.xl;ad.Brderidth=0;ad.A

24、dreated+=neAdreatedEventHandler(this.nAdreated);this.ntrls.Add(ad);this.ntrls.Add(neLiteralntrl(br+当前广告链接为:);/参加Label控件lblAdText=neLabel();lblAdText.Frelr=lr.Red;this.ntrls.Add(lblAdText);privatevidnAdreated(bjetsender,AdreatedEventArgse)this.lblAdText.Text=e.AlternateText;/接着是LgnpublilassLgn:ntrl,I

25、NaingntainerprivatestringstrnnString=server=(lal)Feida;database=aspn;Trusted_nnetin=yes;privateLabellblsgSh;privateTextBxtbUserNae,tbPassd;publiStringUserNaegetreturntbUserNae.Text;settbUserNae.Text=value;prtetedverridevidreatehildntrls()/添加HTL标签this.ntrls.Add(neLiteralntrl(tabletrtdlspan=2align=ent

26、erb登陆窗口/b/td/trtrtdlspan=2align=enter);/添加sgShLabel控件lblsgSh=neLabel();lblsgSh.Frelr=lr.Red;this.ntrls.Add(lblsgSh);this.ntrls.Add(neLiteralntrl(/td/trtrtd用户名:/tdtd);/添加UserNae与PassdTextBx控件tbUserNae=neTextBx();this.ntrls.Add(tbUserNae);this.ntrls.Add(neLiteralntrl(/td/trtrtd密码:/tdtd);tbPassd=neText

27、Bx();tbPassd.Textde=TextBxde.Passrd;this.ntrls.Add(tbPassd);this.ntrls.Add(neLiteralntrl(/td/trtrtd);/添加BtnSubitButtn控件ButtnbtnSubit=neButtn();btnSubit.Text=登陆;btnSubit.lik+=neEventHandler(this.Subit_lik);this.ntrls.Add(btnSubit);this.ntrls.Add(neLiteralntrl(/td/tr/table);/显示完毕privatevidSubit_lik(bj

28、etsender,EventArgse)Sqlnnetinynn=neSqlnnetin(strnnString);ynn.pen();stringstrUserNae,strPassrd,strSelet;strUserNae=tbUserNae.Text;strPassrd=tbPassd.Text;strSelet=selet*frbbs_userhereid=+strUserNae+andpassrd=+strPassrd+;Sqlandy=neSqland(strSelet,ynn);SqlDataReaderdr=y.ExeuteReader();if(dr.Read()/登陆成功

29、this.lblsgSh.Text=登陆成功;else/登陆不成功this.lblsgSh.Text=登陆不成功;dr.lse();ynn.lse();/最后是FterpublilassFter:ntrl,INaingntainerprivatestring_UserNae,_Purvie;publistringUserNaegetreturn_UserNae;set_UserNae=value;publistringPurviegetreturn_Purvie;set_Purvie=value;publiFter()_UserNae=游客;_Purvie=无;prtetedverridevi

30、dreatehildntrls()this.ntrls.Add(neLiteralntrl(用户名:);LabellblUserNae=neLabel();lblUserNae.Frelr=lr.Red;lblUserNae.Fnt.Nae=Arial;lblUserNae.Text=this.UserNae;this.ntrls.Add(lblUserNae);/this.ntrls.Add(neLiteralntrl();this.ntrls.Add(neLiteralntrl(权限:);LabellblPurvie=neLabel();lblPurvie.Frelr=lr.Red;lblPurvie.Fnt.Nae=Arial;lblPurvie.Text=this.Purvie;this.ntrls.Add(lblPur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论