web-dev-qa-db-fra.com

MVC sur lequel le bouton d'envoi a été activé

J'ai deux boutons sur mon formulaire MVC:

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

À partir de mon action sur le contrôleur, comment savoir lequel a été pressé?

124
Coppermill

Nommez les deux boutons d'envoi de la même manière

<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />

Ensuite, dans votre contrôleur, obtenez la valeur de submit. Seul le bouton cliqué transmettra sa valeur.

public ActionResult Index(string submit)
{
    Response.Write(submit);
    return View();
}

Vous pouvez bien sûr évaluer cette valeur pour effectuer différentes opérations avec un bloc de commutateurs.

public ActionResult Index(string submit)
{
    switch (submit)
    {
        case "Save":
            // Do something
            break;
        case "Process":
            // Do something
            break;
        default:
            throw new Exception();
            break;
    }

    return View();
}
162
WDuffy
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

Et dans votre action de contrôleur:

public ActionResult SomeAction(string submit)
{
    if (!string.IsNullOrEmpty(submit))
    {
        // Save was pressed
    }
    else
    {
        // Process was pressed
    }
}
47
Darin Dimitrov

c'est une meilleure réponse, ainsi nous pouvons avoir à la fois du texte et une valeur pour un bouton:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>

et le contrôleur:

public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
    return RedirectToAction("Index", "Home");
...

bref c'est un bouton SUBMIT mais vous choisissez le nom en utilisant l'attribut name, c'est d'autant plus puissant que vous n'êtes pas obligé de soumettre le nom ou le bouton dans les paramètres de la méthode du contrôleur, vous pouvez l'appeler comme vous le souhaitez ...

33
Yakir Manor

vous pouvez identifier votre bouton à partir de la balise nommée comme ci-dessous, vous devez vérifier cela dans votre contrôleur

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
18
Kinjal Gohil

Voici un moyen très simple et agréable de le faire avec des instructions très faciles à suivre à l'aide d'un MultiButtonAttribute personnalisé:

http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

Pour résumer, faites vos boutons de soumission comme ceci:

<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" /> 

Vos actions aiment ceci:

[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
    return Content("Cancel clicked");
}

[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
    return Content("Create clicked");
} 

Et créez cette classe:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
    public string MatchFormKey { get; set; }
    public string MatchFormValue { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[MatchFormKey] != null &&
            controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
    }
}
5
Owen
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
    string submitType = "unknown";

    if(collection["submit"] != null)
    {
        submitType = "submit";
    }
    else if (collection["process"] != null)
    {
        submitType = "process";
    }

} // End of the index method
3
Fredrik Stigsson

Pour simplifier les choses, je dirai que vous pouvez modifier vos boutons comme suit:

<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />

Votre contrôleur:

public ActionResult Create(string btnSubmit, string btnProcess)
{
    if(btnSubmit != null)
       // do something for the Button btnSubmit
    else 
       // do something for the Button btnProcess
}

Ce message ne va pas répondre à Coppermill, car il a été répondu il y a longtemps. Mon message sera utile pour qui cherchera une solution comme celle-ci. Tout d’abord, je dois dire que "la solution de WDuffy est tout à fait correcte" et que cela fonctionne bien, mais ma solution (pas la mienne) sera utilisée dans d’autres éléments et rend la couche de présentation plus indépendante du contrôleur (car votre contrôleur dépend "valeur" utilisée pour afficher l'étiquette du bouton, cette fonctionnalité est importante pour les autres langues.).

Voici ma solution, donnez-leur différents noms:

<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>

Et vous devez spécifier les noms des boutons comme arguments dans l'action, comme ci-dessous:

public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
    if (buttonSave!= null)
    {
        //save is pressed
    }
    if (buttonProcess!= null)
    {
        //Process is pressed
    }
    if (buttonCancel!= null)
    {
        //Cancel is pressed
    }
}

lorsque l'utilisateur soumet la page à l'aide de l'un des boutons, un seul des arguments aura une valeur. Je suppose que cela sera utile pour les autres.

Mise à jour

Cette réponse est assez ancienne et je reconsidère mon opinion. Peut-être que la solution ci-dessus convient au cas où paramètre passant aux propriétés du modèle. ne vous dérangez pas et prenez la meilleure solution pour votre projet.

2
AAAA

Donnez le nom aux deux boutons et obtenez le contrôle de la valeur du formulaire.

<div>
   <input name="submitButton" type="submit" value="Register" />
</div>

<div>
   <input name="cancelButton" type="submit" value="Cancel" />
</div>

Du côté du contrôleur:

public ActionResult Save(FormCollection form)
{
 if (this.httpContext.Request.Form["cancelButton"] !=null)
 {
   // return to the action;
 }

else if(this.httpContext.Request.Form["submitButton"] !=null)
 {
   // save the oprtation and retrun to the action;
 }
}
1
Aniket Sharma

Dans les pages Core 2.2 Razor, cette syntaxe fonctionne:

    <button type="submit" name="Submit">Save</button>
    <button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
        return Page();
    var sub = Request.Form["Submit"];
    var can = Request.Form["Cancel"];
    if (sub.Count > 0)
       {
       .......
1
Leftware

Ne pouvez-vous pas savoir utiliser Request.Form Collection? Si le processus est cliqué, le request.form ["processus"] ne sera pas vide

0
chugh97