【问题标题】:Thymeleaf multiple submit button in one formThymeleaf 以一种形式提交多个提交按钮
【发布时间】:2015-10-02 19:08:40
【问题描述】:

我有一个带有一个表单和两个按钮的 HTML 页面片段:

<form action="#" data-th-action="@{/action/edit}" data-th-object="${model}" method="post">
    <button type="submit" name="action" value="save">save</button>
    <button type="submit" name="action" value="cancel">cancel</button>
</form>

还有控制器:

@RequestMapping(value="/edit", method=RequestMethod.POST)
public ModelAndView edit(@ModelAttribute SomeModel model, 
        @RequestParam(value="action", required=true) String action) {

    if (action.equals("save")) {
        // do something here     
    }

    if (action.equals("cancel")) {
       // do another thing
    }
    return modelAndView;
}

这项工作很好,但如果我有更多按钮,我必须添加更多if 语句来检查action 字符串。还有其他方法可以为表单中的每个按钮创建一个操作吗?

【问题讨论】:

  • 表单操作 url 是 "@{/action/edit}" 但在你的控制器 "/edit" 中,你能告诉我你是如何链接你的 html 和控制器的吗?
  • Pranesh Sahu,可能是控制器类上的前缀@RequestMapping(value="action")

标签: java spring-mvc thymeleaf


【解决方案1】:

您可以使用 params 变量创建具有不同 @RequestMappings 的单独方法。

@RequestMapping(value="/edit", method=RequestMethod.POST, params="action=save")
public ModelAndView save() {}


@RequestMapping(value="/edit", method=RequestMethod.POST, params="action=cancel")
public ModelAndView cancel() {}

【讨论】:

    【解决方案2】:

    如果您不想将每个选项都作为新的请求映射,您可以使用 switch case 来代替 if-case。

    @RequestMapping(value="/edit", method=RequestMethod.POST)
    public ModelAndView edit(@ModelAttribute SomeModel model, 
            @RequestParam(value="action", required=true) String action) {
        switch(action) {
            case "save":
                // do stuff
                break;
            case "cancel":
                // do stuff
                break;
            case "newthing":
                // do stuff
                break;
            default:
                // do stuff
                break;
        }
    }
    

    【讨论】:

    • 很晚才注意到,但default 中的break; 非常多余(因为switch 语句无论如何都会退出)。
    【解决方案3】:

    这适用于我的问题。 在提交按钮上使用 th:formaction 这是你有多少提交按钮的工作 这对于为具有不同提交按钮的表单提供更多链接也很有用

    <form action="#"  class="form" th:action="@{'/publish-post/'+${post.id}}" method="post">
    <input class="savebtn" type="submit" value="Save" th:formaction="'/save-post/'+${post.id}">
    <input class="publish" type="submit" value="Publish Article">
    </form>
    

    【讨论】:

      【解决方案4】:

      对于多个提交按钮,以下对我有用。 注意:th:formaction 在取消按钮中。

      <form action="#" th:action="@{/saveProducts}" th:object="${model}" method="post">
        <button type="submit" name="action" value="cancel" th:formaction="@{/cancelProducts}">CANCEL</button>
        <button type="submit" name="action" value="save">SAVE</button>
      </form>
      

      对于控制器:

         @RequestMapping(value="/saveProducts", method= RequestMethod.POST)
          public String save(@ModelAttribute SomeModel model) {
            *//Do something*
          }
      
          @RequestMapping(value="/cancelProducts", method=RequestMethod.POST)
          public String cancel(@ModelAttribute SomeModel model) {
            *//Do something*
      
          }
      

      【讨论】:

        【解决方案5】:

        您可以知道单击了哪个提交按钮,然后对按钮进行操作 这是代码

        String btnName = request.getParameter("action");
        
        if(btnName.equals("save"))
            // you code....
        else if(btnName.equals("cancel"))
            // you code....
        

        【讨论】:

        • 澄清反对意见:这不仅与问题的重点完全不同(在这种情况下寻找避免if 构造的方法),而且使用request.getParameter(...) 是一种方式比使用 @RequestParam 将其直接连接到方法参数更糟糕(如问题代码中所做的那样)。
        猜你喜欢
        • 1970-01-01
        • 2019-01-16
        • 2012-12-29
        • 2018-01-19
        • 1970-01-01
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多