现今的网络技术的发展目标之一就是要达到窗体和功能性的分离。六七年之前,这并不是一件难事,浏览器会提交一个浏览网页的请求信息,服务器发出需要的网页后,通过浏览器对其进行解析,选取需要的图像文档,这之后,HTML格式的代码就变成了版面形式或网页内容。现在,几乎任何的网页都有一些功能性的行为包含在里面。

在网络从提供静态的内容到成为一个交互式的应用平台的演变过程中,直到我们有了意大利面条式代码之前,窗体和功能性一直被混合在一起。类似于Java Server Page (JSP)和ASP.NET这样的技术能够消除这种混合,但是个ASP研发者要使网页实现更高的合成化并能够重复使用,还需要做很多工作。

在纪录中,当窗体和功能性注定要在对象(由于没有更恰当的词汇,我们姑且称其为对象)中结合在一起时,将二者混合起来就并不是一件坏事,而且还要尽可能的依赖于以编译的代码。假如在一个网页中存在并不依赖于其内部对象的一些功能时,将他们放置在一个动态连接库(DLL)之中并通过DLL而不是脚本来调用这些功能。假如您在Microsoft Transaction Server或Component Services中建立这个DLL时,确保Retain In Memory这个选项已配置,这能够确保对象在需要时能够很快地被调用。 假如您在服务器端使用IIS 5,您就要考虑将include指令(<!-- #include . . . -->)用Server.Execute方法代替。这个方法的性能也许并不如include指令,但是当代码路径没有被执行时他能够避免再次加载网页。要指出的是,include指令首先通过Ssinc.dll ISAPI filter进行处理,而且只有在通过处理任何的include指令而得到一个复合型网页之后,这个网页才会被提交到ASP引擎进行脚本指令处理。而Server.Execute也能够达到同样的效果,他能够在代码指令行没有被执行时,避免出现二次调用网页的现象。

同时,设法将网页的一些内容压缩封装入所谓的"pseudo-controls"之中。您能够使用VBScript (Class. . .End Class)或JavaScript在服务器上建构快速而简易的道具和方法使用对象。您要考虑使用这些对象将一部分内容进行压缩并提供一个针对HTML的解析方法。例如,我们能够假设一个VBScript Class用下面的方法来定义LoginControl,下面的代码将会在网页上输出一个注册对话框:

Dim ctlLogin
Set ctlLogin = New LoginControl
If Not ctlLogin.IsLoggedIn Then
ctlLogin.LoadData Request.Form("Username"),
Request.Form("Password")
ctlLogin.ProcessData
Request.ServerVariables("REQUEST_METHOD")
End If
ctlLogin.Render
Set ctlLogin = Nothing

最后,不要忽视客户机端的脚本指令控制复杂的动态的功能性函数的能力。现在市售的任何主要的浏览器都支持客户机端的JavaScript,但不幸的是,有时不同浏览器的不同执行方式使得他成为一件让人头疼的事,但同时大多数浏览器都给您配置一个将客户机端的JavaScript关闭的选项。尽管如此,只要您仔细考虑到诸多因素,他将成为一个有力的工具。

这些技术将会帮助您更好地在ASP.NET进行面向对象的网络研发工作。他使我们看到在大多数网页中,在保留每个个体部分的功能性的同时,有多少部分的内容能够被压缩并和其他部分相隔离。