zoukankan      html  css  js  c++  java
  • Asp.net:Form

    1 简单处理

    <form action="Handler1.ashx" method="post" >
    <p>客户名称: <input type="text" name="CustomerName" style=" 300px" /></p>
    <p>客户电话: <input type="text" name="CustomerTel" style=" 300px" /></p>
    <p><input type="submit" value="提交" /></p>
    </form>
    

    获取表单数据

    string name = context.Request.Form["CustomerName"];
    string tel = context.Request.Form["CustomerTel"];
    

    2 表单提交

    浏览器并不是将所有的表单控件全部发送到服务器的,而是会查找所有的【成功控件】,只将这些成功控件的数据发送到服务端, 什么是成功控件呢?
    简单地来说,成功控件就是:每个表单中的控件都应该有一个name属性和”当前值“, 在提交时,它们将以 name=value 的形式做为提交数据的一部分。
    对于一些特殊情况,成功控件还有以下规定:
    1. 控件不能是【禁用】状态,即指定【disabled="disabled"】。即:禁用的控件将不是成功控件。
    2. 如果一个表单包含了多个提交按键,那么仅当用户点击的那个提交按钮才算是成功控件。
    3. 对于checkbox控件来说,只有被用户勾选的才算是成功控件。
    4. 对于radio button来说,只有被用户勾选的才算是成功控件。
    5. 对于select控件来说,所有被选择的选项都做为成功控件,name由select控件提供。
    6. 对于file上传文件控件来说,如果它包含了选择的文件,那么它将是一个成功控件。
    此外,浏览器不会考虑Reset按钮以及OBJECT元素。

    注意:
    1. 对于checkbox, radio button来说,如果它们被确认为成功控件,但没有为控件指定value属性, 那么在表单提交时,将会以"on"做为它们的value
    2. 如果在服务端读不到某个表单控件的值,请检查它是否满足以上规则。

    提交方式:在前面的示例代码中,我为form指定了method="post",这个提交方法就决定了浏览器在提交数据时,通过什么方式来传递它们。
    如果是【post】,那么表单数据将放在请求体中被发送出去。
    如果是【get】,那么表单数据将会追加到查询字符串中,以查询字符串的形式提交到服务端。
    建议:表单通常还是以post方式提交比较好,这样可以不破坏URL,况且URL还有长度限制。

    数据的编码:前面我将浏览器的请求细节用Fiddler做了个截图,从这个图中我们可以看到:控件输入的内容并不是直接发送的, 而是经过一种编码规则来处理的。目前基本上只会只使用二种编码规则:application/x-www-form-urlencoded 和 multipart/form-data , 这二个规则的使用场景简单地说就是:后者在上传文件时使用,其它情形则使用前者(默认)。
    这个规则是在哪里指定的呢? 其实form还有个enctype属性,用它就可以指定编码规则,当我在VS2008写代码时,会有以下提示:

    按照我前面说过的编码规则选择逻辑,application/x-www-form-urlencoded做为默认值,所以,一般情况下我们并不用显式指定。 除非我们要上传文件了,那么此时必须设置enctype="multipart/form-data"

    好了,说了这么一大堆理论,我们再来看一下浏览是如何处理表单数据的。这个过程大致分为4个阶段:
    1. 识别所有的成功控件。
    2. 为所有的成功控件创建一个数据集合,它们包含 control-name/current-value 这样的值对。
    3. 按照form.enctype指定的编码规则对前面准备好的数据进行编码。编码规则将放在请求中,用【Content-Type】指出。
    4. 提交编码后的数据。此时会区分post,get二种情况,提交的地址由form.action属性指定的。

    3 多提交按钮表单

    用过Asp.net WebForms框架的人可能都写过这样的页面:一个页面中包含多个服务端按钮。处理方式嘛, 也很简单:在每个按钮的事件处理器写上相应的代码就完事了,根本不用我们想太多。
    不过,对于不理解这背后处理过程的开发人员来说,当他们转到MVC框架下,可能会被卡住:MVC框架中可没有按钮事件! 即使用不用MVC框架,用ashx通用处理器的方式,也会遇到这种问题,怎么办?
    对于这个问题,本文将站在HTML角度给出二个最根本的解决办法。

    方法1:根据【成功控件】定义,我们设置按钮的name,在服务端用name来区分哪个按钮的提交:

    HTML代码

    <form action="Handler1.ashx" method="post">
    <p>客户名称: <input type="text" name="CustomerName" style=" 300px" /></p>
    <p>客户电话: <input type="text" name="CustomerTel" style=" 300px" /></p>
    <p><input type="submit" name="btnSave" value="保存" />
        <input type="submit" name="btnQuery" value="查询" />
    </p>
    </form>
    

    服务端处理代码

    // 注意:我们只要判断指定的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=" 300px" /></p>
    <p>客户电话: <input type="text" name="CustomerTel" style=" 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 == "查询" ) {
        // 查询的处理逻辑
    }
    

    当然了,解决这个问题的方法很多,我们还可以在提交前修改form.action属性。 对于MVC来说,可能有些人会选择使用Filter的方式来处理。最终选择哪种方法,可根据各自喜好来选择。
    我可能更喜欢直接使用Ajax提交到一个具体的URL,这样也很直观,在服务端也就不用这些判断了。接着往下看吧。

    以上转载 fish li

    http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html

  • 相关阅读:
    SpringCloud----分布式事务
    ps----基础
    DVWA靶场之XSS(Stored)通关
    DVWA靶场之XSS(Reflected)通关
    DVWA靶场之SQL injection(blind)通关
    CentOS6与CentOS7的几点区别
    DVWA靶场之SQL Injection通关
    DVWA靶场之File Upload(文件上传)通关
    DVWA靶场之File Inclusion(文件包含)通关
    DVWA靶场之CSRF(跨站请求伪造)通关
  • 原文地址:https://www.cnblogs.com/zjwei55/p/2151224.html
Copyright © 2011-2022 走看看