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. PHP生成图片验证码demo【OOP面向对象版本】

    下面是我今天下午用PHP写的一个生成图片验证码demo,仅供参考. 这个demo总共分为4个文件,具体代码如下: 1.code.html中的代码: <!doctype html> < ...

  2. (旧)子数涵数·C语言——条件语句

    首先,我们讲一下理论知识,在编程中有三种结构,分别是顺序结构.条件结构.循环结构,如果用流程图来表示的话就是: 那么在C语言中,如何灵活运用这三种结构呢?这就需要用到控制语句了. 而条件语句便是控制语 ...

  3. java war run

    #!/bin/bashdate=`date +'%Y%m%d %T'`pid=`ps -ef |grep Credit | grep -v grep|awk '{print $2}'`damocles ...

  4. art-template引擎模板

    art-template简介 artTemplate(后文简称aT)才是模板引擎,而TmodJS(后文简称TJ,曾用名atc)则是依赖于前者的一款模板预编译器.两者都是由腾讯开发.其实aT完全可以独立 ...

  5. andriod 动态显示当前时间

    <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android=&quo ...

  6. 总结隐藏Ribbon菜单的方法

    1. 重载 using (SPSite site = new SPSite("http://SP2010-01")) { using (SPWeb web = site.OpenW ...

  7. R Graphics Cookbook 第3章 – Bar Graphs

    3.1 基本条形图 library(ggplot2) library(gcookbook) pg_mean   #这是用到的数据   group weight 1  ctrl  5.032 2  tr ...

  8. JSON/XML格式化插件比较

    一.引子 Chrome工具里面有很多json格式化的插件,可以让杂乱的json内容变得有序,我们先来看看效果: 正常情况下: 格式化后: 规整多了吧! 二.工具分享+比对 1.JSON Formatt ...

  9. unity下载文件二(http同步下载)

    说到下载,其实C#里的网络模块,真的是被各种封装,最终就看你对这个语言中库的熟悉程度了. 抛开C#中IO效率的弊病不说,真的很容易,记住,太过于注重效率或者追求极致,你将会死的很惨,有时候折中才是最好 ...

  10. CoreAnimation-07-CAAnimationGroup

    概述 简介 CAAnimationGroup又称组动画或动画组 将多个动画放到动画组中,并赋值给layer的animations属性,动画组中所有动画就会并发执行 注意事项 动画组中的动画不会被压缩, ...