我在表单中有两个提交按钮。我如何确定哪一个被击中服务器端?
formaction
。或查看kiril的答案,了解如何使用户可见的HTML与发送到浏览器的值无关-与Greg或Parrot的答案相比,以更易于编码的方式解决国际化问题。
我在表单中有两个提交按钮。我如何确定哪一个被击中服务器端?
formaction
。或查看kiril的答案,了解如何使用户可见的HTML与发送到浏览器的值无关-与Greg或Parrot的答案相比,以更易于编码的方式解决国际化问题。
Answers:
如果给每个人起一个名字,被点击的人将作为其他任何输入被发送出去。
<input type="submit" name="button_1" value="Click me">
解决方案1:
给每个输入一个不同的值并保持相同的名称:
<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />
然后在代码中检查哪个触发了:
if ($_POST['action'] == 'Update') {
//action for update here
} else if ($_POST['action'] == 'Delete') {
//action for delete
} else {
//invalid action!
}
这样做的问题是您将逻辑绑定到输入中用户可见的文本。
解决方案2:为
每个输入一个唯一的名称,并检查$ _POST是否存在该输入:
<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />
并在代码中:
if (isset($_POST['update_button'])) {
//update action
} else if (isset($_POST['delete_button'])) {
//delete action
} else {
//no button pressed
}
更好的解决方案包括使用按钮标签提交表单:
<form>
...
<button type="submit" name="action" value="update">Update</button>
<button type="submit" name="action" value="delete">Delete</button>
</form>
按钮内的HTML (例如..>Update<..
,用户看到的内容;由于提供了HTML,因此value
用户不可见;仅发送到服务器。这样就不会给国际化和多种显示语言带来麻烦(在在以前的解决方案中,按钮的标签也是发送到服务器的值)。
<button>
:submit
和reset
。请注意,reset
它不会提交任何内容,只会重置表单。因此,耶隆的观点仍然存在。
该formaction
属性有一种新的HTML5方法:
<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>
显然,这在IE9和更早版本中不起作用,但是对于其他浏览器,您应该没问题(请参阅:w3schools.com HTML <button> formaction Attribute)。
就个人而言,我通常使用Javascript以这种方式作为备份来远程提交表单(以便更快地获得反馈)。在这两者之间,唯一未覆盖的人是IE <9(禁用Javascript)。
当然,如果您基本上是在服务器端采取相同的操作而不管按下了哪个按钮,那么这可能是不合适的,但是通常,如果有两个用户端操作可用,那么它们也将映射到两个服务器端操作。
编辑:
正如Pascal_dher在评论中指出的那样,该属性在<input>
标签上也可用。
form_tag
。我使它起作用的唯一方法是切换form_for
并使用f.submit formaction: 'your_path'
。
这非常容易测试
<form action="" method="get">
<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">
</form>
只需将其放在HTML页面中,单击按钮,然后查看URL
使用formaction
HTML属性(第5行):
<form action="/action_page.php" method="get">
First name: <input type="text" name="fname"><br>
Last name: <input type="text" name="lname"><br>
<button type="submit">Submit</button><br>
<button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>
<form>
<input type="submit" value="Submit to a" formaction="/submit/a">
<input type="submit" value="submit to b" formaction="/submit/b">
</form>
处理多个提交按钮的最佳方法是在服务器脚本中使用切换大小写
<form action="demo_form.php" method="get">
Choose your favorite subject:
<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">Java Script</button>
<button name="subject" type="submit" value="jquery">jQuery</button>
</form>
服务器代码/服务器脚本-提交表单的位置:
demo_form.php
<?php
switch($_REQUEST['subject']) {
case 'html': //action for html here
break;
case 'css': //action for css here
break;
case 'javascript': //action for javascript here
break;
case 'jquery': //action for jquery here
break;
}
?>
资料来源:W3Schools.com
<form action="demo_form.php" method="get">
也许这里建议的解决方案在2009年有效,但是ive测试了所有上述建议的答案,并且没有人在任何浏览器中工作。
我发现可行的唯一解决方案是这样的:(但是我认为使用起来有点难看)
<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>
formaction="actionurl1"
?您不需要JavaScript。
formaction
定义name
为array
。
<form action='' method=POST>
(...) some input fields (...)
<input type=submit name=submit[save] value=Save>
<input type=submit name=submit[delete] value=Delete>
</form>
服务器代码示例(PHP):
if (isset($_POST["submit"])) {
$sub = $_POST["submit"];
if (isset($sub["save"])) {
// save something;
} elseif (isset($sub["delete"])) {
// delete something
}
}
elseif
非常重要,因为如果没有解析,两者都会被解析。请享用。
switch
如果一个按钮添加了一个按钮却忘记了将其添加到switch
(和/或拼写错误等),则可以将其与默认操作配合使用
由于您未指定要使用的服务器端脚本编写方法,因此,我将为您提供一个使用CherryPy的适用于Python的示例(尽管它也可能对其他上下文有用):
<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>
可以使用名称(使用<button>
标记代替<input>
)来代替使用值来确定按下了哪个按钮。这样,如果您的按钮碰巧具有相同的文本,则不会造成问题。所有表单项的名称(包括按钮)都作为URL的一部分发送。在CherryPy中,每个参数都是执行服务器端代码的方法的参数。因此,如果您的方法仅具有**kwargs
其参数列表(而不是乏味地键入每个表单项的每个名称),那么您可以检查一下按下了哪个按钮,如下所示:
if "register" in kwargs:
pass #Do the register code
elif "login" in kwargs:
pass #Do the login code
<form method="post">
<input type="hidden" name="id" value="'.$id.'" readonly="readonly"/>'; //any value to post PHP
<input type='submit' name='update' value='update' formAction='updateCars.php'/>
<input type='submit' name='delete' value='delete' formAction='sqlDelete.php'/>
</form>
我认为您应该能够读取GET数组中的名称/值。我认为未单击的按钮不会出现在该列表中。
您也可以这样操作(如果您有N个输入,我认为这非常方便)。
<input type="submit" name="row[456]" value="something">
<input type="submit" name="row[123]" value="something">
<input type="submit" name="row[789]" value="something">
一个常见的用例是为每个按钮使用来自数据库的不同ID,因此您以后可以知道在服务器最中间的行被单击了。
在服务器端(在此示例中为PHP),您可以将“ row”读取为数组以获取ID。
$_POST['row']
将是一个只有一个元素的数组,格式为[ id => value ]
(例如:)[ '123' => 'something' ]
。
因此,为了获得点击的ID,您需要执行以下操作:
$index = key($_POST['row']);
$_POST['row']
作为关联数组的优势很聪明!
您还可以使用href属性,并发送带有每个按钮附加值的get。但是那时就不需要表格了
href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
POST
路由下的控制器不起作用。
GET
并不总是适合。如果您“修改模型的状态”,则永远不要使用GET
,因为刷新浏览器可能会透明地发送两次相同的请求。使用GET
只有“查看”的东西,POST
送的状态变化(添加,删除,编辑等)的请求。然后在您的POST
控制器操作中更改状态(数据库,会话...)并投射重定向响应,然后GET
使用新的更改状态。这样做GET
的模型状态的改变是非常肮脏,任何良好的编码器应该避免这样。不好意思这么说。清理代码rulez。
您可以像这样显示按钮:
<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">
然后在代码中,您可以使用以下方法获取值:
if request.method == 'POST':
#valUnits = request.POST.get('unitsInput','')
#valPrice = request.POST.get('priceInput','')
valType = request.POST.get('typeBtn','')
(valUnits和valPrice是我从留作说明的表单中提取的其他一些值)
<?php
if(isset($_POST["loginForm"]))
{
print_r ($_POST); // FOR Showing POST DATA
}
elseif(isset($_POST["registrationForm"]))
{
print_r ($_POST);
}
elseif(isset($_POST["saveForm"]))
{
print_r ($_POST);
}
else{
}
?>
<html>
<head>
</head>
<body>
<fieldset>
<legend>FORM-1 with 2 buttons</legend>
<form method="post" >
<input type="text" name="loginname" value ="ABC" >
<!--Always use type="password" for password -->
<input type="text" name="loginpassword" value ="abc123" >
<input type="submit" name="loginForm" value="Login"><!--SUBMIT Button 1 -->
<input type="submit" name="saveForm" value="Save"> <!--SUBMIT Button 2 -->
</form>
</fieldset>
<fieldset>
<legend>FORM-2 with 1 button</legend>
<form method="post" >
<input type="text" name="registrationname" value ="XYZ" >
<!--Always use type="password" for password -->
<input type="text" name="registrationpassword" value ="xyz123" >
<input type="submit" name="registrationForm" value="Register"> <!--SUBMIT Button 3 -->
</form>
</fieldset>
</body>
</html>