web-dev-qa-db-ja.com

1つのフォームにThymeleafの複数の送信ボタン

1つのフォームと2つのボタンがある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ステートメントを追加する必要があります。フォームで1つのアクション各ボタンに作成できる別の方法はありますか?

19
Liem Do

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() {}
37
Kayaman

If-caseの代わりにswitch 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;
    }
}
3
Gemtastic