我在一个表单中有两个提交按钮。我如何确定哪一个击中了服务器端?


当前回答

您可以在一个表单中设置多个提交按钮 例子:

 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="Add Address" title="" formaction="/addAddress"> 
 <input type="submit" name="" class="btn action_bg btn-sm loadGif" value="update Address" title="" formaction="/updateAddress"> 

其他回答

更新后的答案是使用带有formaction和formtarget的按钮

在本例中,第一个按钮在新选项卡中启动了一个不同的url /预览。其他三个使用表单标记中指定的操作。

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

完整的文档在这里

解决方案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
}

你可以像这样显示按钮:

<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是我从表单中提取的其他一些值,用于演示)

这里有一个新的HTML5方法,formaction属性:

<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>

显然,这在Internet Explorer 9和更早的版本中不起作用,但对于其他浏览器应该没问题(参见:w3schools.com HTML <button> formaction Attribute)。

就我个人而言,我通常使用JavaScript远程提交表单(以获得更快的感知反馈),并使用这种方法作为备份。在这两者之间,唯一不涉及的是禁用JavaScript的ie9版本之前的Internet Explorer。

当然,如果不管按哪个按钮,基本上在服务器端执行相同的操作,这可能是不合适的,但通常情况下,如果有两个可用的用户端操作,那么它们也会映射到两个服务器端操作。

正如Pascal_dher在注释中指出的,这个属性在<input>标记上也可用。

也许这里建议的解决方案在2009年是有效的,但我已经测试了所有这些被好评的答案,没有一个在任何浏览器上都有效。

我发现唯一有效的解决方案是这样的(但我觉得用起来有点难看):

<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';"/>
</form>