我如何只使用<a href="...">
标签提交一个POST表单到showMessage.jsp
页面?
<form action="showMessage.jsp" method="post">
<a href="showMessage.jsp"><%=n%></a>
<input type="hidden" name="mess" value=<%=n%>/>
</form>
如果您使用按钮,就不需要 JavaScript:
<form action="your_url" method="post">
<button type="submit" name="your_name" value="your_value" class="btn-link">Go</button>
</form>
你可以通过样式使按钮看起来像链接,例如:
.btn-link {
border: none;
outline: none;
background: none;
cursor: pointer;
color: #0000EE;
padding: 0;
text-decoration: underline;
font-family: inherit;
font-size: inherit;
}
a
标签。 - Winfield Trail你需要使用JavaScript来完成这个任务。
<form id="form1" action="showMessage.jsp" method="post">
<a href="javascript:;" onclick="document.getElementById('form1').submit();"><%=n%></a>
<input type="hidden" name="mess" value=<%=n%>/>
</form>
你需要在你的 form
对象上使用 Javascript 的 submit
函数。可以查看其他函数。
<form action="showMessage.jsp" method="post">
<a href="javascript:;" onclick="parentNode.submit();"><%=n%></a>
<input type="hidden" name="mess" value=<%=n%>/>
</form>
<form action="/ControllerName/ActionName" method="post">
<a href="javascript:;" onclick="parentNode.submit();"><%=n%></a>
<input type="hidden" name="mess" value=<%=n%>/>
</form>
我刚刚浏览了这里的一些示例,没有看到MVC示例,所以决定发表这篇文章。
然后,在您的控制器操作中,我只需要在顶部放置<HTTPPost>
。 我认为,如果您没有<HTTPGET>
,它仍然可以工作,但明确地放置它会感觉更安全一些。
<a href= ..
成为POST方法。但是,如果您可以访问页面的CSS,则可以使用表单来替代它。不幸的是,仅在CSS中将按钮样式化为锚标记的明显方法不跨浏览器兼容,因为不同的浏览器对<button value= ...
的处理方式不同。Incorrect:
<form action='actbusy.php' method='post'>
<button type='submit' name='parameter' value='One'>Two</button>
</form>
<form action='actbusy.php' method='post'>
<input class=hidden name='parameter' value='blaah'>
<button type='submit' name='delete' value='Delete'>Delete</button>
</form>
<button value="Bad">Good</button>
,它显示为“Good”。 - rybo111<a href="/some/action?foo=bar">
,而是写成 <a data-post="/some/action" data-var-foo="bar" href="#do_action_foo_bar">
。脚本会生成一个隐藏的表单和隐藏的输入框,并在链接被点击时提交表单。
$("a[data-post]")
.each(function() {
let href = $(this).data("post"); if (!href) return;
let $form = $("<form></form>").attr({ method:"POST",action:href }).css("display","none")
let data = $(this).data()
for (let dat in data) {
if (dat.startsWith("postVar")) {
let varname = dat.substring(7).toLowerCase() // postVarId -> id
let varval = data[dat]
$form.append($("<input/>").attr({ type:"hidden",name:varname,value:varval }))
}
}
$("body").append($form)
$(this).data("postform",$form)
})
.click(function(ev) {
ev.preventDefault()
if ($(this).data("postform")) $(this).data("postform").submit(); else console.error("No .postform set in <a data-post>")
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a data-post="/some/action" data-var-foo="bar" href="#do_action_foo_bar">click me</a>
如果您正在使用express/node.js,一个很好的覆盖http函数的方法是使用npm包method-override。 Method-override example。