web-dev-qa-db-fra.com

Bouton de soumission multiple Thymeleaf dans un seul formulaire

J'ai un fragment de page HTML avec un formulaire et 2 boutons:

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

Et le contrôleur:

@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;
}

Cela fonctionne bien, mais si j'ai plus de bouton, je dois ajouter plus d'instructions if pour vérifier la chaîne action. Existe-t-il une autre façon de créer ne action pour chaque bouton dans le formulaire?

19
Liem Do

Vous pouvez créer des méthodes distinctes avec différents @RequestMappings en utilisant la variable params.

@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

Au lieu d'un cas-if, vous pourriez avoir un cas de commutateur, si vous ne souhaitez pas prendre toutes les options en tant que nouveau mappage de demande.

@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