1.HTML表单的提交方式

对于一个普通HTML表单来说,它有两个重要的属性:action 和 method。
action属性指明当前表单提交之后由哪个程序来处理,这个处理程序可以是任何动态网页或者 servlet 或者 CGI(Common Gateway Interface),在asp.net里面一般都是都aspx页面来处理。
method属性指明form表单的提交方式。它有两个可能值get和post。

(1)get方式提交的表单在地址栏会显示参数名和参数值,而post方式不会。用post提交参数相对来说更隐蔽一些,也相对安全一些。假如我们这个页面用于用户登录并且存放用户信息的表为“users”,我们的sql语句可能会这么写:

string sql=” select * from users where username='”+username+”’ and password='”+password+”’”;

然后我们的 username 和 password 变量从表单提交的数据获取,正常情况下用户填写是没有问题,就上面的例子来说用户填写的用户名和密码分别是“sa”和“123456”,那么我们最后得到的SQL语句是:

sql=”select * from users where username=’sa’ and password=’’”

这样是没有问题的。

如果用get方式提交,用户可以对上面的参数进行一些改动,比如在地址栏直接输入:

http://localhost/GetUserInfo.aspx?username=zhoufoxcn&pwd=123';delete * from users'

那么我们得到的SQL就是:

string sql=” select * from users where username='zhoufoxcn' and password='';delete * from users'”

执行上面的SQL语句就能把Users这个表里的所有数据删除掉!这个一个触目惊心的危险!这个就叫SQL注入。

(2)由于浏览器地址栏能输入的最大字符数有限制,所以用get方式提交不能处理参数值更大的表单,而post方式则没有这个限制。

2.获取表单值

通过用get方式提交表单我们可以看到提交到服务器的时候,在网页后面有“?username=sa&pwd=12345”这么一个字符串,也就是以表单里HTML控件的名字=控件值的方式,并且如果存在多个控件,彼此之间以“&”分割,那么我们就可以以控件名来获取控件值。获取HTML控件值常见有以下集中方式:

 获取方式  表单提交方式
 Request.QueryString["控件名"]   适合于get方式提交的表单
 Request.Form["控件名"]  适合于post方式提交的表单
 Request["控件名"]  同时适合于get和post方式提交的表单

3.乱码问题

对于用户登录的表单,我们在用户名和密码处分别输入“小姑凉”和“123456”,用户就可能会变成“???”,之所以出现这样的情况就是因为我们的编码原因。

所谓乱码,就是用一种编码的字符串却用了另一种编码来显示,造成不能正常显示的现象。
这就像我们在酒吧里对一个懂普通话的服务员说来一杯酒,他马上会送你一杯酒;可是当我们对一个不懂普通话的服务员用普通话说来一杯酒,他就会一头雾水了。
之所以出现乱码就是因为在这里客服端请求的编码和服务器响应的编码不一致

默认情况下 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编码中的一种。

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

更改为:

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

这样就能正常显示了。
建网站的时候默认编码就是utf-8,无需更改。

4.服务器端表单

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

<form action="接收数据页面" method="post">

并且我们都是利用的HTML控件。现在我们要介绍服务器端表单,服务器端表单与前面的表单相比,多了一个runat=”server”标记,如下:

<form id="form1" runat="server">

在服务器端表单里可以不用指定action属性,表示由当前页面处理,也可以不指定 method 属性,默认为post方式提交表单。在服务器端表单里,我们不光可以使用 HTML 控件,还可以使用 HTML 服务器控件,还可以使用 asp.net 控件 。
另外需要注意的是,在一个 asp.net 页面中可以有多个不带 runat=”server” 标记的表单,但是只能有一个服务器端表单。

5.HTML服务器控件

HTML服务器控件与普通服务器控件不同的是:在普通HTML控件中加上了一个 id 属性和一个 runat=”server” 标记。如下就是一个 HTML 服务器控件:

<input type="text" runat="server" id="txtUserName" />

HTML服务器控件有几个限制:
在整个 asp.net 页面中这个控件 id 的必须唯一,并且 HTML 服务器控件只能放在 HTML 服务器表单中。因为一个 asp.net 页面只能有一个服务器表单,所以说在服务器表单中控件的 id 值必须唯一,因为我们在编程的时候通过这个 id 来访问 HTML 服务器控件。如果不唯一就会报错。

所有的服务器控件经过服务器运行之后都会变成标准的 HTML 控件。
这样我们可以得出一个结论:如果我们的控件功能本来就很简单,我们就可以直接使用HTML控件,这样就可以减轻服务器的负担,提高运行效率。

另外,在上面的代码中多了一些以前我们没有见过的部分:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNTQ0MjI5MTUzZGR1mFZ52ODFgAKe7Qx9/67qMGFJCA==" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKIpeT6DgKl1bKzCQK1qbSRCwLdkpmPAcJ7Zy/C66ypRIq49nr3hQNayqwk" />

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

来源:http://zhoufoxcn.blog.51cto.com/792419/166808

【ASP.NET 基础】表单和控件的更多相关文章

  1. 关于Web项目里的给表单验证控件添加结束时间不得小于开始时间的验证方法,日期转换和前台显示格式之间,还有JSON取日期数据格式转换成标准日期格式的问题

    项目里有些不同页面间的日期显示格式是不同的, 第一个问题: 比如我用日期控件WdatePicker.js导包后只需在input标签里加上onClick="WdatePicker()" ...

  2. Js表单验证控件-02 Ajax验证

    在<Js表单验证控件(使用方便,无需编码)-01使用说明>中,写了Verify.js验证控件的基本用法,基本可以满足大多数验证需求,如果涉及服务端的验证,则可以通过Ajax. Ajax验证 ...

  3. 详解Ajax请求(三)——jQuery对Ajax的实现及serialize()函数对于表单域控件参数提交的使用技巧

    原生的Ajax对于异步请求的实现并不好用,特别是不同的浏览器对于Ajax的实现并不完全相同,这就意味着你使用原生的Ajax做异步请求要兼顾浏览器的兼容性问题,对于java程序员来讲这是比较头疼的事情, ...

  4. [WPF自定义控件库]简单的表单布局控件

    1. WPF布局一个表单 <Grid Width="400" HorizontalAlignment="Center" VerticalAlignment ...

  5. 表单验证控件Verify.js

    自己工作常用到表单录入验证,就顺手写了一个验证控件,刚开始写得很烂.多年后翻出来,又优化了一下,增加了一些功能.拿出来分享分享. 主要功能就是表单的录入验证. * 1.当录入框必填时,在控件后生成红色 ...

  6. Js表单验证控件(使用方便,无需编码)-01使用说明

    演示地址:http://weishakeji.net/Utility/Verify/Index.htm    开源地址:https://github.com/weishakeji/Verify_Js ...

  7. Js表单验证控件

    演示地址:http://weishakeji.net/Utility/Verify/Index.htm    开源地址:https://github.com/weishakeji/Verify_Js ...

  8. HTML之表单类控件、图像类元素的CSS特别样式汇总

    前言 记录下开发过程中一些特殊表单控件(input.textarea.select等)的样式控制 input 取消光标聚焦时,输入框的外延边框 input:focus{ outline:none } ...

  9. jeecg表单页面控件权限设置(请先看官方教程,如果能看懂就不用看这里了)

    只是把看了官方教程后,觉得不清楚地方补充说明一下: 1. 2. 3. 4.用"jeecgDemoController.do?addorupdate"这个路径测试,不出意外现在应该可 ...

随机推荐

  1. phpwind的rewrite重写原理

    没有深入过pw,被人问到这方面的问题,搜索了一下,发现了一篇博文,但原博客已打不开. http://www.phpsoho.com/html/document/200608/1154750694.ht ...

  2. hadoop pipes wordcount compile

    http://devel.cs.stolaf.edu/projects/bw/wiki.real/index.php/Hadoop_Reference,_January_2011 http://guo ...

  3. 容器---List和AbstractList

    一.前言 前面我们介绍了Collection及其抽象实现,在JAVA的容器体系里,由Collection派生出来的有两大体系,即List和Map.本文以及后续文章将重点分析List体系.本文将重点分析 ...

  4. Java Web Cookie

    一.什么是cookie? 1.Cookie能使站点跟踪特定访问者的访问次数.最后访问时间和访问者进入站点的路径 2.Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告 3.Cook ...

  5. (旧)子数涵数·C语言——让C帮你做计算

    之前,我们学过了我们的第一个C程序--hello World.现在开始进一步学习,想一想如何让C帮你做计算. 我们先来看代码(我没有新建,还是用之前的hello world.cpp): 好,因为之前在 ...

  6. Linux下安装配置Nexus

    一.安装和运行nexus 1.下载nexus:http://www.sonatype.org/nexus/go 可选择tgz和zip格式,以及war,选择tgz或zip时不同版本可能在启动时存在一定问 ...

  7. 初识你---------Swift【下篇】

    Swift中的结构体 Swift的结构体对比OC来说,可以添加初始化方法.可以遵守代理协议等,同时:Swift的Bool类型的变量也是一个结构体,所以只能选择true和false. Swift中声明结 ...

  8. Android5.0新特性——兼容性(support)

    兼容性 虽然Material Design新增了许多新特性,但是并不是所有新内容对对下保持了兼容. 使用v7包 v7 support libraries r21 及更高版本包含了以下Material ...

  9. webpack打包

    (1) 首先生成一个package.json文件 进入项目文件的根目录执行npm init 在根目录中生成一个package.json文件 (2)全局安装webpack  执行npm install ...

  10. R语言学习笔记:字符串处理

    想在R语言中生成一个图形文件的文件名,前缀是fitbit,后面跟上月份,再加上".jpg",先不百度,试了试其它语言的类似语法,没一个可行的: C#中:"fitbit&q ...