我在表单中有两个提交按钮。如何在服务器端确定哪一个被点击了?
将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非常重要,因为如果不使用elseif,两个条件都将被解析。
<form action="/login" method="POST">
<input type="text" name="username" value="your_username" />
<input type="password" name="password" value="your_password" />
<button type="submit">Login</button>
<button type="submit" formaction="/users" formmethod="POST">Add User</button>
</form>
同一个表单用于添加新用户和登录用户。
因为您没有具体说明使用的是哪种服务器端脚本方法,所以我将给出一个适用于Python的示例,使用CherryPy(虽然它也可能对其他情境有用):
<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作为参数列表(而不是 tediously 打出每个表单项的每个名称),则可以像这样检查按下了哪个按钮:
if "register" in kwargs:
pass # Do the register code
elif "login" in kwargs:
pass # Do the login code
<form>
<input type="text" name="foo" value="bar">
<button type="submit" name="operation" value="val-1">Operation #1</button>
<button type="submit" name="operation" value="val-2">Operation #2</button>
</form>
如果在这个表单上按下Enter键,将会发送以下参数:
foo=bar&operation=val-1
<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>
<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']作为关联数组是聪明的! - Gwyneth Llewelyn/preview。其余三个按钮使用在form标签中指定的action。
<button type='submit' class='large' id='btnpreview' name='btnsubmit' value='Preview' formaction='/preview' formtarget='blank' >Preview</button>
<button type='submit' class='large' id='btnsave' name='btnsubmit' value='Save' >Save</button>
<button type='submit' class='large' id='btnreset' name='btnsubmit' value='Reset' >Reset</button>
<button type='submit' class='large' id='btncancel' name='btnsubmit' value='Cancel' >Cancel</button>
完整的文档在这里
。$_REQUEST[]。 - Gwyneth Llewelynformaction和formmethod属性。
<form action="/addimage" method="POST">
<button>Add image</button>
<button formaction="/home" formmethod="get">Cancel</button>
<button formaction="/logout" formmethod="post">Logout</button>
</form>
你也可以使用 href 属性,并为每个按钮附加值发送 get 请求。但是这样就不需要表单了。
href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
POST 路由下的控制器不起作用。 - Xavi MonteroGET并不总是适用的。如果您“修改模型状态”,那么您绝不能使用GET,因为刷新浏览器可能会导致自动发送两次相同的请求。只能使用GET来“查看”内容,并使用POST发送状态更改的请求(添加、删除、编辑等)。然后在您的POST控制器操作中更改状态(数据库、session...),并生成一个重定向响应,然后GET新的更改状态。对于模型状态更改使用GET非常不好,任何优秀的编码人员都应该避免这样做。很抱歉这么说,但干净的代码规则。 - Xavi Montero
switch,如果有人添加了一个按钮并忘记将其添加到switch(和/或拼错了等等)。 - Gwyneth Llewelyn