Question

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

De mon action Controller comment puis-je savoir que l'on a été pressé?

Était-ce utile?

La solution

Nom à la fois votre boutons d'envoi de la même

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

Ensuite, dans votre contrôleur obtenir la valeur de présenter. Seul le bouton cliqué passera 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 commutation.

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

    return View();
}

Autres conseils

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

est une meilleure réponse, donc nous pouvons avoir à la fois du texte et de la 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");
...

en bref est un bouton d'envoi, mais vous choisissez le nom en utilisant l'attribut name, son encore plus puissant parce que vous n'êtes pas obligé de le nom soumettez ou un bouton dans les paramètres de la méthode de commande, vous pouvez l'appeler comme vous voulez ...

vous pouvez identifier votre bouton à partir de là étiquette de nom comme ci-dessous, Vous devez vérifier comme ceci en vous contrôleur

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

Voici une façon vraiment agréable et simple de le faire avec vraiment facile à suivre les instructions en utilisant un MultiButtonAttribute de commande:

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

En résumé, faire de votre soumettre des boutons comme ceci:

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

Vos actions comme celle-ci:

[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éer 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;
    }
}
// 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

Pour le rendre plus facile je dire que vous pouvez modifier vos boutons sur les points suivants:

<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 poste ne va pas répondre à Coppermill, parce qu'il a été répondu il y a longtemps. Mon poste sera utile pour qui recherche de solution comme celui-ci. Tout d'abord, je dois dire que « la solution de WDuffy est tout à fait correct » et il fonctionne très bien, mais ma solution (pas vraiment le mien) sera utilisé dans d'autres éléments et il fait la couche de présentation plus indépendante du contrôleur (parce que votre contrôleur dépendent « valeur » qui est utilisée pour montrer l'étiquette du bouton, cette fonction est importante pour les autres langues.).

Voici ma solution, leur donner des noms différents:

<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 en utilisant 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 vieux et je reconsidère effectivement mon avis. peut-être au-dessus de la solution est bon pour la situation qui le passage de paramètres aux propriétés du modèle. ne vous dérange pas et prendre la meilleure solution pour votre projet.

Donner le nom à la fois des boutons et obtenir le contrôle de la valeur de la forme.

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

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

Sur le 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;
 }
}

Dans les pages de base 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)
       {
       .......

Pouvez-vous pas trouver à l'aide Request.Form Collection? Si le processus est cliqué sur le [ « processus »] Request.Form ne sera pas vide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top