asp.net夜话之三:表单和控件

2013 年 8 月 15 日3730

在今天我主要要介绍的有如下知识点:
HTML表单的提交方式
HTM控件
获取HTML表单内容
乱码问题
SQL注入
服务器端表单
HTML服务器控件

HTML表单的提交方式
对于一个普通HTML表单来说,它有两个重要的属性:action和method。
action属性指明当前表单提交之后由哪个程序来处理,这个处理程序可以是任何动态网页或者servlet或者CGI(Common Gateway Interface),在asp.net里面一般都是都aspx页面来处理。
method属性指明form表单的提交方式。它有两个可能值get和post。
下面我们以一个例子来说明get和post的区别。用Dreamweaver8创建两个aspx页面,分别为Register.aspx和GetUserInfo.aspx。暂时我们不需要在GetUserInfo.aspx页面写任何代码,Register.aspx页面的代码如下:

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>

将Register.aspx和GetUserInfo.aspx都保存到C:\Inetpub\http://www.zjjv.com/夜话之二:内置对象》中讲Request和Response对象的时候讲到过,没有看过的朋友请返回去看一下,这里只贴出结果:

从上面的图上我们看到默认情况下Request的ContentEncoding为UTF8Encoding,而Response的ContentEncoding为System.Text.DBCSCodePageEncoding,二者的不一致导致了输入中文成了乱码。
我们常见的编码有gb2312、gbk和unicode几种,gb2312能显示日常生活最常用的6000多个汉字,这对于一般的公文足够了,可是如果要用来显示一个古文献就不行了(据说康熙词典收录了4万多汉字),当它不能显示的时候也会出现乱码。Gbk是在gb2312的基础上扩展的,大概能显示1万8千多个汉字,这对于一般古文献也差不多够了。Unicode则更大一些,它能显示20901个汉字(范围是从\u4e00到\u9fa5),并且还能显示日文、韩文、台湾文字、香港文字和新加坡等文字,所以目前很多网站都采用unicode编码。Utf8编码就是unicode编码中的一种,关于它们的编码原理有兴趣的朋友可以查询有关资料。
因为目前用Dreamweaver创建动态网页的时候默认都是采用gb2312编码(asp和jsp的程序员的网站编码很多都采用了这个默认值)。如果我们要想正确获取表单的值,我们可能就需要更改默认编码,对于上面的乱码问题,我们只需要更改Register.aspx页面就行,将Register.aspx页面的这部分更改一下:

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
更改为:

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>

这样就能正常显示了,如下:

注意,使用Microsoft Visual Studio 2005创建网站的时候默认编码就是utf-8,无需更改。

服务器端表单
在此之前我们见到的表单都是如下格式:

这个页面在浏览器端的HTML源代码如下:

我们可以看到在客服端得到的HTML代码中都是标准的HTML代码,我们的文本框和密码框及服务器端提交按钮(因为它在服务器代码里也有runat=”server”标记)变成了如下代码:

也就是,所有的服务器控件经过服务器运行之后都会变成标准的HTML控件。这样我们可以得出一个结论:如果我们的控件功能本来就很简单,我们就可以直接使用HTML控件,这样就可以减轻服务器的负担,提高运行效率。另外,在上面的代码中多了一些以前我们没有见过的部分:

因为服务器会保存服务器控件的状态和属性,所以它会利用一些隐藏域来保存这方面的信息,这部分的内容是经过Base64编码的。

服务器控件的好处是我们可以动态在代码中动态控制服务器控件的属性,对于上面的代码我们改造如下:

<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>

上面代码中多了“”,并且提交按钮多了一个onserverclick="btnOK_Click"属性。在“”标记中我们写了一个protected void btnOK_Click(Object Src, EventArgs E)方法,这个方法符合System.EventHandler委托的标准。这个方法有两个参数,第一个表示由什么控件激发了这个事件,第二个参数表示事件发生时的一些相关信息。
在protected void btnOK_Click(Object Src, EventArgs E)方法中我们利用了类似WinForm中操作控件的方式来操作我们的服务器控件,这也就是为什么asp.net页面成为WebForm的原因。在这个方法里我们获取了控件的值,并最后将提交按钮禁用。
提交按钮的onserverclick属性值表示当这个按钮点击后由服务器上的哪个方法进行处理,这个方法要满足System.EventHandler委托的定义,这里我们写了btnOK_Click这个方法名。
这个页面初次运行的效果如下:

然后我们分别输入”zhoufoxcn”和”123456”,提交表单之后的效果如下:

我们看到在当前页面输出了表单控件的值,并且最后提交按钮呈现灰色状态,也就是被禁用了。
上面例子中我们确实就像在WinForm一样控制asp.net控件,非常方便。其实在asp.net开发中,用的最多的是asp.net服务器控件,而不是HTML服务器控件,asp.net控件提供了比HTML服务器控件更多的灵活性,以后的文章中会继续探讨asp.net控件。

实际上不管是HTML控件还是HTML服务器控件在asp.net里面用的都不是太多,介绍这部分主要是提及一些被Microsoft Visual Studio 2005隐藏的细节,还有其它动态页面与asp.net页面进行交互等问题。

后记:写完这篇文章已经是2008年9月18日临晨两点了,最近工作比较忙,整个系列下来可能会有30篇左右,我会在工作之余继续酝酿。同时也在考虑如何安排更合理,并且尽可能地将实际项目中应该注意到的一些问题贯穿进来。比如这次文章中讲到了SQL注入问题,以后在ADO.NET部分我会讲解如何防止SQL注入。希望大家多多提宝贵意见。
周金桥于2008年9月18日星期四 2:03

0 0