49 votes

ASP.NET MVC Core/6 : boutons d'envoi multiples

J'ai besoin de plusieurs boutons d'envoi pour effectuer différentes actions dans le contrôleur.

J'ai vu une solution élégante ici : Comment gérer les boutons d'envoi multiples dans ASP.NET MVC Framework ? Avec cette solution, les méthodes d'action peuvent être décorées avec un attribut personnalisé. Lorsque les routes sont traitées, une méthode de cet attribut personnalisé vérifie si la propriété de l'attribut correspond au nom du bouton de soumission cliqué.

Mais dans MVC Core (RC2 nightly build) je n'ai pas trouvé ActionNameSelectorAttribute (J'ai aussi cherché dans le dépôt Github). J'ai trouvé une solution similaire qui utilise ActionMethodSelectorAttribute ( http://www.dotnetcurry.com/aspnet-mvc/724/handle-multiple-submit-buttons-aspnet-mvc-action-methods ).

ActionMethodSelectorAttribute est disponible mais la méthode IsValidForRequest a une signature différente. Il y a un paramètre de type RouteContext . Mais je n'ai pas pu y trouver les données du message. Je n'ai donc rien à comparer avec ma propriété d'attribut personnalisée.

Existe-t-il une solution aussi élégante dans MVC Core que dans les versions précédentes de MVC ?

85voto

Will Ray Points 6722

Vous pouvez utiliser le HTML5 [formaction](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formaction) pour cela, au lieu de l'acheminer côté serveur.

<form action="" method="post">
    <input type="submit" value="Option 1" formaction="DoWorkOne" />
    <input type="submit" value="Option 2" formaction="DoWorkTwo"/>
</form>

Ensuite, il suffit d'avoir des actions de contrôleur comme ceci :

[HttpPost]
public IActionResult DoWorkOne(TheModel model) { ... }

[HttpPost]
public IActionResult DoWorkTwo(TheModel model) { ... }

Un bon polyfill pour les anciens navigateurs peut être trouvé ici .

Gardez à l'esprit que...

  1. Le premier bouton d'envoi sera toujours choisi lorsque l'utilisateur appuie sur le retour chariot.
  2. Si une erreur - ModelState ou autre - se produit sur l'action qui a été affichée aussi, il devra renvoyer l'utilisateur à la vue correcte. (Ce n'est pas un problème si vous publiez via AJAX, cependant).

55voto

Shaun Luttin Points 1585

La version 1.1.0 d'ASP.NET Core comporte les éléments suivants FormActionTagHelper qui crée un formaction attribut.

<form>
    <button asp-action="Login" asp-controller="Account">log in</button>
    <button asp-action="Register" asp-controller="Account">sign up</button>
</form>

Cela donne ce résultat :

<button formaction="/Account/Login">log in</button>
<button formaction="/Account/Register">sign up</button>

Il fonctionne également avec input balises qui sont type="image" o type="submit" .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X