Je viens d'écrire un billet à ce sujet : Boutons d'envoi multiples avec ASP.NET MVC :
En gros, au lieu d'utiliser ActionMethodSelectorAttribute
J'utilise ActionNameSelectorAttribute
ce qui me permet de prétendre que le nom de l'action est celui que je veux. Heureusement, ActionNameSelectorAttribute
ne me fait pas seulement spécifier le nom de l'action, mais je peux choisir si l'action actuelle correspond à la demande.
Voilà donc ma classe (d'ailleurs je n'aime pas trop le nom) :
public class HttpParamActionAttribute : ActionNameSelectorAttribute {
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
return true;
if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
return false;
var request = controllerContext.RequestContext.HttpContext.Request;
return request[methodInfo.Name] != null;
}
}
Pour l'utiliser, il suffit de définir un formulaire comme ceci :
<% using (Html.BeginForm("Action", "Post")) { %>
<!— …form fields… -->
<input type="submit" name="saveDraft" value="Save Draft" />
<input type="submit" name="publish" value="Publish" />
<% } %>
et contrôleur avec deux méthodes
public class PostController : Controller {
[HttpParamAction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveDraft(…) {
//…
}
[HttpParamAction]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Publish(…) {
//…
}
}
Comme vous le voyez, l'attribut ne nécessite pas de spécifier quoi que ce soit. De plus, les noms des boutons sont directement traduits en noms de méthodes. En outre (je n'ai pas essayé), ces boutons devraient également fonctionner comme des actions normales, de sorte que vous pouvez poster à l'un d'eux directement.
9 votes
À noter à partir de ASP.NET Core il existe des solutions beaucoup plus simples que celles qui sont énumérées ici.
1 votes
Ce tutoriel pourrait vous aider : Soumettre un formulaire à différentes méthodes d'action en ASP.NET MVC