Form 表单提交数据
学习于http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html
感谢fish的博文,
摘录:
1.表单的处理方式:
<form action="Handler1.ashx" method="post">
<p>
客户名称:
<input type="text" name="CustomerName" value="" style="width: 300px" /></p>
<p>
客户电话:
<input type="text" name="CustomerTel" value="" style="width: 300px" /></p>
<p>
<input type="submit" value="提交" /></p>
</form>
----当我们使用WebForms的服务器表单控件时,一般都会提交到页面自身来处理(action属性指向当前页面),且是post方式提交,这样可以方便地使用按钮事件以及从服务器控件访问从浏览器提交的控件输入结果。
----表单的数据是以name1=value1&name2=value2 的形式提交的,其中name,value分别对应了表单控件的相应属性。
2.服务端获取浏览器提交的表单的输入
string name = context.Request.Form["CustomerName"];
string tel = context.Request.Form["CustomerTel"];
----直接根据表单控件的name属性访问Request.Form就可以了。
3.浏览器在提交表单时,要做哪些事情
浏览器并不是将所有的表单控件全部发送到服务器的,而是会查找所有的【成功控件】,只将这些成功控件的数据发送到服务端,什么是成功控件呢?简单地来说,成功控件就是:每个表单中的控件都应该有一个name属性和”当前值“, 在提交时,它们将以 name=value 的形式做为提交数据的一部分。对于一些特殊情况,成功控件还有以下规定:
1) 控件不能是【禁用】状态,即指定【disabled="disabled"】。即:禁用的控件将不是成功控件。
2) 如果一个表单包含了多个提交按键,那么仅当用户点击的那个提交按钮才算是成功控件。
3) 对于checkbox控件来说,只有被用户勾选的才算是成功控件。
4) 对于radio button来说,只有被用户勾选的才算是成功控件。
5) 对于select控件来说,所有被选择的选项都做为成功控件,name由select控件提供。
6) 对于file上传文件控件来说,如果它包含了选择的文件,那么它将是一个成功控件。
注意: 1) 对于checkbox, radio button来说,如果它们被确认为成功控件,但没有为控件指定value属性, 那么在表单提交时,将会以"on"做为它们的value
2) 如果在服务端读不到某个表单控件的值,请检查它是否满足以上规则。
提交方式:在前面的示例代码中,我为form指定了method="post",这个提交方法就决定了浏览器在提交数据时,通过什么方式来传递它们。 如果是【post】,那么表单数据将放在请求体中被发送出去。 如果是【get】,那么表单数据将会追加到查询字符串中,以查询字符串的形式提交到服务端。 建议:表单通常还是以post方式提交比较好,这样可以不破坏URL,况且URL还有长度限制。
数据的编码:控件输入的内容并不是直接发送的, 而是经过一种编码规则来处理的。目前基本上只会只使用二种编码规则:application/x-www-form-urlencoded 和 multipart/form-data , 这二个规则的使用场景简单地说就是:后者在上传文件时使用,其它情形则使用前者(默认)。
以上过程大致可归结为4个阶段:
1) 识别所有的成功控件。
2) 为所有的成功控件创建一个数据集合,它们包含 control-name/current-value 这样的值对。
3) 按照form.enctype指定的编码规则对前面准备好的数据进行编码。编码规则将放在请求中,用【Content-Type】指出。
4) 提交编码后的数据。此时会区分post,get二种情况,提交的地址由form.action属性指定的。
4.多个提交按钮的表单
<form action="Handler1.ashx" method="post">
<p>客户名称: <input type="text" name="CustomerName" style="width: 300px" /></p>
<p>客户电话: <input type="text" name="CustomerTel" style="width: 300px" /></p>
<p><input type="submit" name="btnSave" value="保存" />
<input type="submit" name="btnQuery" value="查询" />
</p>
</form>
服务端处理代码:
1)
// 注意:我们只要判断指定的name是否存在就可以了。
if( string.IsNullOrEmpty(context.Request.Form["btnSave"]) == false ) {
// 保存的处理逻辑
}
if( string.IsNullOrEmpty(context.Request.Form["btnQuery"]) == false ) {
// 查询的处理逻辑
}
2)我将二个按钮的name设置为相同的值(根据前面的成功控件规则,只有被点击的按钮才会提交),在服务端判断value,示例代码如下:
<form action="Handler1.ashx" method="post">
<p>
客户名称:
<input type="text" name="CustomerName" style="width: 300px" /></p>
<p>
客户电话:
<input type="text" name="CustomerTel" style="width: 300px" /></p>
<p>
<input type="submit" name="submit" value="保存" />
<input type="submit" name="submit" value="查询" />
</p>
</form>
string action = context.Request.Form["submit"];
if( action == "保存" ) { // 保存的处理逻辑 }
if( action == "查询" ) { // 查询的处理逻辑 }