ASP.NET中如何定义POST请求提交内容及添加额外参数?
嘿,我来帮你把这些问题掰扯清楚~
先搞懂表单POST请求的默认组装逻辑
浏览器处理表单POST请求时,只会把带有name属性的标准表单控件(比如input、textarea、select等,且未被disabled禁用)的值打包进请求体里。
拿你的表单举例:
<textarea name="uname">会把uname=myName传入请求;- 当你点击某个
submit按钮时,只有被点击的这个按钮(带name和value)会被加入请求——比如点“finish”就加req=finish,点“begin”就加req=begin,其他未被点击的submit按钮不会被包含。
这就是你看到uname=myName&req=finish请求体的原因。
你的问题逐个解答
1. 如何给请求添加更多值?
有两种常用方式:
- 静态添加:隐藏输入框:如果参数是固定值,不管点哪个按钮都要传,直接加个
<input type="hidden" name="参数名" value="参数值">即可,浏览器会自动把它打包进请求体。 - 动态添加:JavaScript控制:如果需要根据点击的按钮决定是否传某个值,就用JS监听按钮点击事件,手动添加参数后再提交表单。
2. 这些值都是自动组装的吗?
是的,但有前提:只有带name属性的标准表单控件(且未被禁用)才会被浏览器自动纳入请求体。自定义属性(比如你说的personalid="123")不属于这个范畴,浏览器完全不会识别,所以不会自动传递。
3. 按钮上加自定义属性能随请求发送吗?
不行哦。浏览器只认表单控件的标准name属性,自定义属性(哪怕你写personalid或者其他名字)不会被当作请求参数打包。如果想把按钮相关的自定义值传进去,得用JS把这个属性值取出来,再手动加到请求里。
针对你的需求:点击finish时同时传req=finish和personalID=123
给你三个可行方案,按需选择:
方案一:简单静态版(允许所有按钮都传personalID)
如果不管点finish还是begin,都可以传personalID=123,直接加个隐藏输入框就行,最省事:
<form asp-controller="Home" asp-action="Check" method="post"> <textarea id="uname" name="uname">myName</textarea> <!-- 新增隐藏输入框 --> <input type="hidden" name="personalID" value="123"> <input type="submit" name="req" value="finish" /> <input type="submit" name="req" value="begin" /> </form>
点击finish时请求体为uname=myName&req=finish&personalID=123,点击begin时为uname=myName&req=begin&personalID=123。
方案二:JS动态控制版(仅点击finish时传personalID)
如果只有点finish才需要传personalID=123,点begin时不传,用JS监听finish按钮的点击事件,动态添加参数后提交:
<form asp-controller="Home" asp-action="Check" method="post" id="myForm"> <textarea id="uname" name="uname">myName</textarea> <input type="submit" name="req" value="finish" id="finishBtn" /> <input type="submit" name="req" value="begin" /> </form> <script> // 监听finish按钮点击 document.getElementById('finishBtn').addEventListener('click', function(e) { // 先阻止默认的表单提交行为 e.preventDefault(); // 创建一个隐藏输入框,把personalID加进去 const hiddenInput = document.createElement('input'); hiddenInput.type = 'hidden'; hiddenInput.name = 'personalID'; hiddenInput.value = '123'; // 把这个输入框加到表单里 document.getElementById('myForm').appendChild(hiddenInput); // 手动提交表单 document.getElementById('myForm').submit(); }); </script>
这个方案里,只有点击finish时personalID=123才会被加入请求体,点begin时不会带这个参数。
方案三:全手动提交(更灵活)
如果想完全控制每个按钮的提交参数,可以把submit按钮改成普通按钮,用JS构造FormData来发送请求:
<form asp-controller="Home" asp-action="Check" method="post" id="myForm"> <textarea id="uname" name="uname">myName</textarea> <button type="button" id="finishBtn">finish</button> <button type="button" id="beginBtn">begin</button> </form> <script> // 处理finish按钮点击 document.getElementById('finishBtn').addEventListener('click', function() { const form = document.getElementById('myForm'); // 基于表单创建FormData对象,自动包含已有控件的值 const formData = new FormData(form); // 添加自定义参数 formData.append('req', 'finish'); formData.append('personalID', '123'); // 发送POST请求 fetch(form.action, { method: form.method, body: formData }).then(response => { // 处理请求响应,比如跳转 window.location.href = response.url; }); }); // 处理begin按钮点击 document.getElementById('beginBtn').addEventListener('click', function() { const form = document.getElementById('myForm'); const formData = new FormData(form); formData.append('req', 'begin'); fetch(form.action, { method: form.method, body: formData }).then(response => { window.location.href = response.url; }); }); </script>
这种方式自由度最高,你可以随意添加或修改要提交的参数,甚至不需要依赖表单的默认提交行为。
内容的提问来源于stack exchange,提问作者jamheadart

