在asp.net中一个网页或窗口被看成一个web form,web form 被看成是一个对象而被赋予了属性、方法,事件。.net架构里面一个比较重要的概念就是”对象”:所有的控件都是对象,甚至数据类型都成了对象;每种数据类型都有自己特有的属性和方法。
web form的后缀名是aspx。当一个浏览器第一次请求一个aspx文件时,web form页面将被clr(common language runtime)编译器编译。此后,当再有用户访问此页面的时候,由于aspx页面已经被编译过,所以,clr会直接执行编译过的代码。
为了简化程序员的工作,aspx页面不需要手工编译,而是在页面被调用的时候,由clr自行决定是否编译。一般来说,下面两种情况下,aspx会被重新编译:
1.aspx页面第一次被浏览器请求;
2.aspx被改写
由于aspx页面可以被编译,所以aspx页面具有组件一样的性能。这就使得aspx页面至少比同样功能的asp页面快250%!
web页面处理过程
和所有的服务器端进程一样,当aspx页面被客户端请求时,页面的服务器端代码被执行,执行结果被送回到浏览器端。这一点和asp并没有太大的不同。
但是,asp.net的架构为我们做了许多别的事情。比如,它会自动处理浏览器的表单提交,把各个表单域的输入值变成对象的属性,使得我们可以像访问对象属性那样来访问客户的输入。它还把客户的点击映射到不同的服务器端事件。
web form的处理过程如下:
用户对server control的一次操作,就可能引起页面的一次往返处理:页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端。
每一次页面被请求,或者页面事件被提交到服务器,asp.net运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。当下一次页面被处理时,asp.net运行环境是不知道它的上一次执行情况的。
在asp.net中,页面对象的属性、页面控件的属性被称为”view state”(页面状态)。页面状态在asp.net中被受到特别关照。请看服务器端(page1.aspx)的代码:
<!–源文件:form\web页面简介\page1.aspx–> <html> <body> <script language=”vb” runat=”server”> sub showvalues(sender as object, args as eventargs) divresult.innertext = “you selected ” _ & selopsys.value & ” for machine ” _ & txtname.value & “.” end sub </script> <div id=”divresult” runat=”server”> </div> <form runat=”server”> 机器名: <input type=”text” id=”txtname” runat=”server”> <p /> 操作系统: <select id=”selopsys” size=”1″ runat=”server”> <option>windows 95</option> <option>windows 98</option> <option>windows nt4</option> <option>windows 2000</option> </select> <p /> <input type=”submit” value=”submit” runat=”server” onserverclick=”showvalues”> </form> </body> </html> |
运行后将自动被解释成客户端代码,如下:
<html> <body> you selected windows 98 for machine iceberg. <form name=”ctrl0″ method=”post” action=”pageone.aspx” id=”ctrl0″> <input type=”hidden” name=”__viewstate” value=”a0z1741688109__x”> 机器名: <input type=”text” id=”txtname” name=”txtname” value=”tizzy”> <p /> 操作系统: <select id=”selopsys” size=”1″ name=”selopsys”> <option value=”windows 95″>windows 95</option> <option selected value=”windows 98″>windows 98</option> <option value=”windows nt4″>windows nt4</option> <option value=”windows 2000″>windows 2000</option> </select> <p /> <input type=”submit” value=”submit”> </form> </body> </html> |
对于上面的代码,服务器端控件能在服务器端脚本中被自由运用。如果我们用传统的asp代码实现上述的功能的话:
if len(request.form(“selopsys”)) > 0 then stropsys = request.form(“selopsys”) strname = request.form(“txtname”) response.write(“you selected ” & stropsys _ & ” for machine ” & strname & “.”) end if |
if len(selopsys.value) > 0 then response.write(“you selected ” & selopsys.value _ & ” for machine ” & txtname.value & “.”) end if |
通过上面例子不难看出:asp.net页面具有组件方式的方便性和灵活性。
web form事件模型
在asp.net中,事件是一个非常重要的概念。我们举两个例子来说明在web form 中的应用。
例子一:多按钮事件
我们在一个<form></form>里面有几个按钮,多个事件的响应我们该怎么处理呢?在asp.net中有很好的处理机制,我们可以在一个页面中写几个方法来分别响应不同的事件。
设计思想:根据五个按钮的功能,我们定义了五个方法:addbtn_click(sender as object, e as eventargs)、addallbtn_click(sender as object, e as eventargs)、removebtn_click(sender as object, e as eventargs)、removeallbtn_click(sender as object, e as eventargs)、result(sender as object,e as eventargs),分别用来处理全部加进、单个加进、单个取消、全部取消和提交事件。我们的form提交的时候,还是提交给本页面,由本页面进行处理。(由于篇幅有限,这里就不登载代码了,有兴趣的朋友可以看《asp.net完全入门》第二篇第一章第四节 web事件模型)
例子二:autopostback
postback属性在page_load事件中出现的,在一个用户请求结束后,如果页面重新load,则返回一个true。这对初始化一个页面来讲是一件非常容易的事情, 代码见《asp.net完全入门》第二篇第一章第四节 web事件模型。
服务器端控件
服务器端控件,英文是server control。这是web页面能够容纳的对象之一。
为什么叫”server control”?这是因为这些control是在服务器端存在的。服务器端控件也有自己的外观,在客户端浏览器中,server control的外观由html代码来表现。server control会在初始化时,根据客户的浏览器版本,自动生成适合浏览器的html代码。
在这一部分作者介绍了各种服务器控件,这里我只摘录其中的 validationsummary控件节选
用户的输入有时候是按照一定的顺序来的,有效性控件验证用户的输入并设置一个属性来线使用户的输入是否通过了验证。当所用得验证项都被处理之后,页面的isvalid属性就被设置,当有其中的一个验证没有通过时,整个页面将会不被通过验证。
当页面的isvalid属性为false时,validationsummary属性将会表现出来。他获得页面上的每个确认控件并对每个错误提出修改信息。
<!–源文件:form\servercontrol\summary.aspx–> <%@ page clienttarget=downlevel %> <html> <head> <script language=”vb” runat=”server”> sub listformat_selectedindexchanged(sender as object, e as eventargs) change display mode of the validator summary when a new option end sub </script> </head> <form runat=”server”> </td> <font face=”verdana” size=”-1″>select the type of validation summary display you wish: </font> <asp:dropdownlist id=”listformat” autopostback=true onselectedindexchanged=”listformat_selectedindexchanged” runat=server > </form> </body> |
服务器端的html控件
html控件在服务器端是可见的,所以我们可以根据它来按照我们的意愿来编写。html控件表现为一些可见的控件。
作者在这一章中全面介绍了各类http 控件,我也只摘录其中的一节:
htmltable控件
htmltable服务控件能让你轻松的创建你的表格的行和列,也可以按照程序的模式自动生成表格。
我们的例子展示了这个特性:
<table id=”table1″ cellpadding=4 cellspacing=0 border=”1″ runat=”server” />
这就是在asp.net中,表格的表示。做两个select控件来让用户选择表格的属性:
<p> 行: <select id=”select1″ runat=”server”> <option value=”1″>1</option> <option value=”2″>2</option> <option value=”3″>3</option> <option value=”4″>4</option> </select> <br> 列: <select id=”select2″ runat=”server”> <option value=”1″>1</option> <option value=”2″>2</option> <option value=”3″>3</option> <option value=”4″>4</option> </select> 在用户提交的时候,实际上我们示对页面进行了刷新,即在page_load方法里面处理,具体如下(htmltable.aspx): <!–源文件: form\htmlcontrol\htmltable.aspx–> <html> <head> <script language=”vb” runat=”server”> sub page_load(sender as object, e as eventargs) dim numrows as integer dim numcells as integer dim i as integer = 0 dim j as integer = 0 dim row as integer = 0 dim r as htmltablerow dim c as htmltablecell 产生表格 |