[译.原创]Delphi.net 初级开发指南(5)
l 第五章
Web Forms:构建Asp.Net应用程序的基石(I)
导读:探讨一下Web Form 页面 - Asp.Net开发中的中枢元素。以一个Delphi开发人员的眼光来看:Web Form是个什么东东?设计一个Web Form时,在aspx文件和内置代码文件之间有什么关联?
翻译:黄浩,HelsWang@126.com , 转摘请保留完整信息。
原文:http://delphi.about.com/library/weekly/aa051104a.htm
访问本教程所有文章:http://www.cnblogs.com/hels
嗯,看来在前面的章节中我没有把你吓到了。
首先我们回想一下本教程的目标:就是学习怎么用Delphi .Net构建一个“实用”的Asp.Net Web应用程序,至少外观和操作要像BDSWebExample(点击在线运行浏览) demo 那样。
我们还有很长的路要走。下一步又要花费我们的时间了…
Web Form是什么东东?
如果你用过Delphi来构建过Windows的桌面程序,那你应该很熟悉Tform对象,Tform是构建win32程序(或者VCL.Net)的基石,在Asp.Net的世界里,Web Forms 页面是构建Asp.net程序的基石。类似于TForm对象,Web Forms也为你的程序界面提供可视化设计;每一个web form都是程序的商业逻辑和用户界面的混合体,最终都会汇总成一个HTML文件返回给用户的浏览器。
此外, web form是一个在运行期编译和运行的类;它也提供属性、方法和事件,用于供Asp.Net的framework在处理来自用户浏览器的请求时使用。
在最后一节,我们将要成功的创建我们的第一个Asp.Net Web程序,它生产出包含HTML和ASP.NET server控件的Web Forms页面(当然有些东西在“标准的”Tform上是没有的)。让我们看看为什么。
Web Form的结构
当你用Delphi.net创建一个Asp.Net Web应用程序时,Web forms由两个文件组成:可视的部分(aspx文件)和一个单独的包含代码逻辑的文件(内置代码的*.pas)。哦,还有第三个文件:resx文件,它是用来保存一些附加信息(将来的某些章节我们还要讨论它)。
Web Form 是作为一个容器而工作的,你可以把要显示的静态文本(HTML控件)和任务web控件放置到Web Form上。你可以使用Delphi的Web Forms设计器和ASP.NET的server控件在一起工作,就像在设计一个普通的Win32程序一样。
单一文件的 Web Forms 页面
注意:Web Form可以把可视化元素和逻辑代码创建到一个单一的aspx文件里。页面的代码没有编译成单独的类,这些代码被编译到了aspx文件里的<script>块里了。通常来说,你应该避免创建这种单一文件的forms,原因如下:
l Delphi.Net的IDE不支持直接创建单一文件的Web Forms页面。
l 当页面被部署到web服务器后,逻辑代码也跟随着web form页面一起被部署,因为逻辑代码根本就在aspx文件里面。然而,不要让用户(就是那些用浏览器发出页面请求人们)看到这些代码,而仅仅是页面处理完毕后汇总的HTML结果。
l 还有其他一些约束:你不能以拖拉的方式在页面上增加非可视控件(比如数据控件);你必须手工填写事件处理代码;由于页面上的(脚本)代码都是没有编译链接的,除非你运行页面否则你不能发现那些编译错误。
l 最重要的:当前版本的Delphi语言不支持作为单一文件的web forms里面的脚本语言。你将不得不用C# (或者VB.Net)来写代码。
设计一个 Web Form
通常,一个Asp.Net web应用程序是有很多不同的页面(web forms)组成的,就好像桌面程序是有很多forms组成一样。
注意,当你用delphi创建一个新的Asp.Net程序时(前一章我们已经做过了),一个空白的web form 已经加到project里面了。这个web form被赋了一个默认的名字"WebForm1.aspx",此外,回忆一下前面章节说的,根据你的web form的作用给它取一个有意义的名字是很可取的做法。
注意:为了方便起见最好打开我们前面章节创建的项目"DelphiAspNetTEST"。打开最近工作的项目的最快方法是启动delphi后,在"Welcome Page"页面上定位到"Recent Project选项。

(图 5_1)
注意:你也可以打开菜单:File – Reopen,从最近打开的项目列表中选择。又或者,你可以打开菜单:File - Open Project然后定位到你系统上的.bdsproj 或者.dpr项目文件(asp.net的项目文件大多数放到c:\InetPub\WWWRoot\...目录底下)。
一旦你打开一个项目,Delphi就会在Designer视图上显示你的web form。在IDE的底部,你可以看到三个编辑视图选择页:"WebForm1.aspx", "WebForm1.pas"(如果你的页面使用的是默认的名字)和"Design"。Design页应该是激活的。
为了帮助你设计用户界面,Delphi允许你像在桌面win32项目上设计普通的Tform一样设计你的web forms。只是多了个HTML标记编辑器(Tag Editor),辅助你可视地编辑你的web form页面上的标记。

(图 5_2)
Web form设计器支持两种视图:"Design" 视图和"*.aspx" 视图。Design 视图显示web form的界面内容,aspx 视图显示自动产生的Html元素,标记和属性。
Design视图是被初学者最经常、频繁使用的,还有在定义web form的界面外观时也是。然而,愿意的话你也可以在aspx 视图上工作(或者在标记编辑器),因为这种工作方式可以进行更高级的控制,更精确的调整。注意aspx 视图纯粹就是HTML;如果你在aspx 视图上工作的时间越多,你就会对Asp.Net越熟悉。说句老实话,我在创建web控件的事件代码时,仅使用aspx 视图而已。

(图 5_3)
aspx或HTML视图
上面说过了,当你在Web Form上增加一个控件时(使用Design视图),Delphi 就会自动维护产生HTML。每个Web Form包含一个<form> HTML元素。任何的web控件、html控件或者其他的标记和元素都会在<form> 和</form>标记(元素)里面。你使用Design视图往web form上增加任何东西都会被转化和储存为HTML元素。如果你熟悉HTML(对于HTML你懂的越多你就越容易掌握Asp.Net),你将会发现对aspx视图里面的内容也是多么的熟悉。一些非标准的HTML标记格式如:
<asp:button id=Button1 runat="server" text="Button"></asp:button>
前面章节介绍过这个Button web控件了,当这个页面最终显示在浏览器时,这个元素就是下面这种描述了:
<input type="submit" name="Button1" value="Button" id="Button1" />
此外,我们在接下来的章节里还将讨论web控件。
WebForm1.pas ... TWebForm1 ... WebForm1.aspx ...
在我们继续往下之前,请快速浏览一下"WebForm1.pas"(内置代码)文件。暂时来说,你只需知道这个单元定义了一个继承于System.Web.UI.Page,名叫TWebForm1的类。

(图 5_4)
aspx文件和内置代码文件之间的关联
.pas文件里面的代码描述了一个从基类System.Web.UI.Page继承的类(连同在implementation段里的事件处理句柄、在interface段的声明等在一起)。在.aspx文件的顶部的@ Page指示符里,属性Inherits(Delphi自动创建和维护)指明了.aspx文件和放置代码的文件的关系
<%@ Page language="c#" Debug="true" Codebehind="WebForm1.pas" AutoEventWireup="false" Inherits="WebForm1.TWebForm1" %> <html>...
</html> |
虽然一个Web Forms页面有两个独立的文件组成,但当你的程序运行时它们形成了一个单一的单元。在一个项目里所有Web Form的内置代码类文件【译注:指的应该是.pas文件吧】都给编译到同一个DLL文件里。
Library (DLL) = 装配(Assembly)
整个asp.net应该程序实际上就是一个DLL。如果你选择菜单:Project - View Source,你可以在代码编辑器上看到整个项目的源码…注意第一行:"library DelphiASPNETTest;",这个就告诉了Delphi编译器,这个项目是要编译成DLL(.Net世界里的一种装配方式)。警告:你不要手工修改这个文件,除非规定了它的源码要和自动生成的不一样。此外,在遥远的将来我们再讨论项目文件。【译注:不知原作者的意思是讨论还是不讨论】

(图 5_5)
当用户浏览页面时,因为.aspx是动态编译的,所以它和内置代码文件的关系就在页面的顶部的指示符脚本里确定好。
两个截然不同而又有关联的类允许你可以把用户界面和程序逻辑分割开来。
你部署了你的程序后,还可以允许你修改可视的用户界面而不用重新编译整个项目(但你不能增加新的web控件,只是允许修改纯粹的HTML)
Codebehind, Inherits, Language等属性
按规定,在.aspx文件顶部的@Page指示符指定了aspx文件和pas文件的关系。@Page指示符 里面包含了某些指定这种关系的属性。
Inherits属性标识了页面所继承的类,在我们这个例子里WebForm1.aspx(类)是从在WebForm1.pas里定义的TWebForm1继承下来的。
CodeBehind属性指定了包含页面的类的文件名字。这个属性只被Delphi的HTML设计器所使用。它告诉设计器到哪里去找页面的类,因此设计器就可以创建一个和这个页面一起工作的实例。运行期这个属性就不再使用了。
Language属性指定当编译页面里面定义的任何代码时所使用的语言。注意在Delphi.Net的应用程序里这个属性会被设为"C#" - 在当前的Delphi语言版本中唯一支持的(在上面已经讨论过了)。
AutoEventWireup属性向ASP.NET说明如何把事件关联到事件处理方法。若为true,则页面运行时特别命名的事件处理程序Page_Load()和Page_Init()会被ASP.NET自动调用。否则需要连接事件和其处理程序。在delphi.net里默认是false,你最好不要改变它。
最后一个,Debug属性指定了页面是否要加上调试信息一起编译。默认是true。你在部署应用程序之前的最后一次编译时应该把这个属性设为false。
在@Page指示符里你还可以手工增加很多其他的属性,在将来的一些特定的章节中我们再讨论吧。
本章到次就结束了,下章预告:在Asp.net应用程序中实现对话框。
待续…
浙公网安备 33010602011771号