Asp.net Form Action

本文详细介绍了HTML表单的提交机制,包括如何定义成功控件、表单数据的编码规则及提交方式,还提供了多提交按钮表单的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 简单处理

<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" 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="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>

服务端处理代码

// 注意:我们只要判断指定的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 == "查询" ) {
     // 查询的处理逻辑
}

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


转自:

http://www.cnblogs.com/zjwei55/archive/2011/08/23/2151224.html


### .NET 中设置 Form 表单的 `Action` 属性 在 ASP.NET 或者 ASP.NET Core 应用程序中,HTML `<form>` 标签用于收集用户输入并将其发送到服务器处理。`action` 属性指定了当表单被提交时所指向的目标 URL。 对于简单的 HTML 表单,在 Razor 页面或视图内定义如下: ```html <form action="/Home/SubmitForm" method="post"> <label for="name">姓名:</label> <input type="text" id="name" name="CustomerName"/> <label for="tel">电话:</label> <input type="text" id="tel" name="CustomerTel"/> <button type="submit">提交</button> </form> ``` 上述代码片段展示了如何创建一个 POST 请求形式的数据提交路径 `/Home/SubmitForm`[^1]。 为了确保安全性和防止跨站脚本攻击 (XSS),推荐使用反伪造令牌来增强安全性: ```html @using(Html.BeginForm("SubmitForm", "Home", FormMethod.Post)) { @Html.AntiForgeryToken() <div> <label>姓名:</label><br /> <input type="text" name="CustomerName"/><br /><br /> <label>电话:</label><br /> <input type="text" name="CustomerTel"/><br /><br /> <input type="submit" value="提交" class="btn btn-default"/> </div> } ``` 这段 Razor 语法不仅设置了正确的 `action` 和 HTTP 方法 (`POST`) ,还加入了防伪验证功能以提高应用的安全性[^3]。 在控制器端,则可以通过读取请求中的表单字段值来进行业务逻辑处理: ```csharp public IActionResult SubmitForm(string CustomerName, string CustomerTel) { // 处理接收到的信息... return View(); } ``` 此方式适用于传统的基于 MVC 架构的应用开发模式;而在现代 JavaScript 框架(如 Vue.js)与后端 API 结合的情况下,通常会利用 AJAX 技术异步传输数据给指定路由,此时可以省去页面刷新的过程而仅更新部分内容[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值