web-dev-qa-db-fra.com

Formulaire de rasoir MVC avec plusieurs boutons de soumission différents?

Une vue Razor a 3 boutons dans un formulaire. Toutes les actions des boutons nécessiteront des valeurs de formulaire, qui sont essentiellement des valeurs venant des champs de saisie.

Chaque fois que je clique sur l'un des boutons, il me redirige vers une action par défaut. Pouvez-vous s'il vous plaît indiquer comment je peux soumettre un formulaire à différentes actions en appuyant sur un bouton?

J'apprécie vraiment votre temps, vos conseils et votre aide.

52
Toubi

Vous pouvez aussi essayer ceci:

<input type="submit" name="submitbutton1" value="submit1" />
<input type="submit" name="submitbutton2" value="submit2" />

Ensuite, dans votre fonction par défaut, vous appelez les fonctions souhaitées:

if( Request.Form["submitbutton1"] != null)
{
    // Code for function 1
}
else if(Request.Form["submitButton2"] != null )
{
    // code for function 2
}
82
Jeroen Doppenberg

Cette solution élégante fonctionne pour le nombre de boutons d'envoi:

@Html.Begin()
{
  // Html code here
  <input type="submit" name="command" value="submit1" />
  <input type="submit" name="command" value="submit2" />

}

Et dans la méthode d'action de vos contrôleurs, acceptez-le en tant que paramètre.

public ActionResult Create(Employee model, string command)
{
    if(command.Equals("submit1"))
    {
      // Call action here...
    }
    else
    {
      // Call another action here...
    }
}
63
Priyank Sheth

dans la vue

<form action="/Controller_name/action" method="Post>

 <input type="submit" name="btn1" value="Ok" />
 <input type="submit" name="btn1" value="cancel" />
 <input type="submit" name="btn1" value="Save" />
</form>

dans l'action 

string str =Request.Params["btn1"];
if(str=="ok"){


}
if(str=="cancel"){


}
if(str=="save"){


}
15
Lamloumi Afif

Vous pouvez utiliser JS + Ajax . Par exemple, si vous avez un bouton, vous pouvez le dire ce qu’il doit faire lors d’un événement au clic . Voici le code:

 <input id="btnFilterData" type="button" value="myBtn">

Ici votre bouton en html: Dans la section script, vous devez utiliser ce code (cette section devrait être à la fin du document):

<script type="text/javascript">
$('#btnFilterData').click(function () {
    myFunc();
});
</script>

Et enfin, vous devez ajouter la fonction ajax (dans une autre section de script, qui devrait être placée au début du document):

function myFunc() {
    $.ajax({
        type: "GET",
        contentType: "application/json",
        url: "/myController/myFuncOnController",
        data: {
             //params, which you can pass to yu func
        },
        success: function(result) {

        error: function (errorData) {

        }
    });
};
10
Arthur

La solution la plus propre que j'ai trouvée est la suivante:

Cet exemple consiste à effectuer deux actions très différentes. le principe de base consiste à utiliser la valeur pour transmettre des données à l'action.

A votre avis:

@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{
    if (isOnDli)
    {
        <button name="removeDli" value="@result.WeNo">Remove From DLI</button>
    }
    else
    {
        <button name="performDli" value="@result.WeNo">Perform DLI</button>
    }
}

Puis dans votre action:

    public ActionResult DliAction(string removeDli, string performDli)
    {
        if (string.IsNullOrEmpty(performDli))
        {
            ...
        }
        else if (string.IsNullOrEmpty(removeDli))
        {
            ...
        }

        return View();
    }

Ce code doit être facile à modifier afin d’obtenir des variations le long du thème, par exemple. changez le nom du bouton pour qu'il soit identique, alors vous n'avez besoin que d'un paramètre sur l'action, etc., comme on peut le voir ci-dessous:

A votre avis:

@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{

        <button name="weNo" value="@result.WeNo">Process This WeNo</button>

        <button name="weNo" value="@result.WeNo">Process A Different WeNo This Item</button>
}

Puis dans votre action:

    public ActionResult DliAction(string weNo)
    {
        // Process the weNo...

        return View();
    }
4
Paul Zahra

Essayez d’envelopper chaque bouton dans sa propre forme dans votre vue.

  @using (Html.BeginForm("Action1", "Controller"))
  {
    <input type="submit" value="Button 1" />
  }

  @using (Html.BeginForm("Action2", "Controller"))
  {
    <input type="submit" value="Button 2" />
  }
3
TK-421

Vous pouvez utiliser des boutons normaux (non submit). Utilisez javascript pour réécrire (lors d'un événement 'onclick') l'attribut 'action' du formulaire sur quelque chose que vous voulez, puis soumettez-le. Générez le bouton à l'aide d'un assistant personnalisé (créez un fichier "Helper.cshtml" dans le dossier App_Code, à la racine de votre projet).

@helper SubmitButton(string text, string controller,string action)
{   
    var uh = new System.Web.Mvc.UrlHelper(Context.Request.RequestContext);
    string url = @uh.Action(action, controller, null);   
    <input type=button  onclick="(
                                       function(e)
                                                 {
                                                   $(e).parent().attr('action', '@url'); //rewrite action url
                                                   //create a submit button to be clicked and removed, so that onsubmit is triggered
                                                   var form = document.getElementById($(e).parent().attr('id'));
                                                   var button = form.ownerDocument.createElement('input');
                                                   button.style.display = 'none';
                                                   button.type = 'submit';
                                                   form.appendChild(button).click(); 
                                                   form.removeChild(button);              
                                                  }
                                      )(this)" value="@text"/>
}

Et puis utilisez-le comme:

@Helpers.SubmitButton("Text for 1st button","ControllerForButton1","ActionForButton1")
@Helpers.SubmitButton("Text for 2nd button","ControllerForButton2","ActionForButton2")
...

Dans votre formulaire.

3
galmeida

Le moyen le plus simple est d’utiliser les balises html5 FormAction et FormMethod

<input type="submit" 
           formaction="Save"
           formmethod="post" 
           value="Save" />
    <input type="submit"
           formaction="SaveForLatter"
           formmethod="post" 
           value="Save For Latter" />
    <input type="submit"
           formaction="SaveAndPublish"
           formmethod="post"
           value="Save And Publish" />

[HttpPost]
public ActionResult Save(CustomerViewModel model) {...}

[HttpPost]
public ActionResult SaveForLatter(CustomerViewModel model){...}

[HttpPost]
public ActionResult SaveAndPublish(CustomerViewModel model){...}

Vous pouvez utiliser de nombreux autres moyens. Consultez cet article Le bouton de soumission multiple de ASP.Net MVC est utilisé de différentes manières

1
Ali Adravi

C'est ce qui a fonctionné pour moi. 

formaction="@Url.Action("Edit")"

Extrait: 

 <input type="submit" formaction="@Url.Action("Edit")" formmethod="post" value="Save" class="btn btn-primary" />

<input type="submit" formaction="@Url.Action("PartialEdit")" formmethod="post" value="Select Type" class="btn btn-primary" />

 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit( Quote quote)
        {
           //code 
       }
 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult PartialEdit(Quote quote)
        {
           //code
        }

Peut aider quelqu'un qui souhaite avoir 2 méthodes d'action différentes au lieu d'une méthode utilisant des sélecteurs ou des scripts client.

0
user2695433

Si vous utilisez un rasoir pur, c’est-à-dire sans contrôleur MVC: 

<button name="SubmitForm" value="Hello">Hello</button>
<button name="SubmitForm" value="World">World</button>
@if (IsPost)
{
    <p>@Request.Form["SubmitForm"]</p>
}

Cliquez sur chacun des boutons pour afficher Hello et World. 

0
Jacques

N'a pas vu de réponse à l'aide des aides de balise (Core MVC), donc ça va (pour une action de suppression):

Sur HTML:

<form action="" method="post" role="form">
<table>
@for (var i = 0; i < Model.List.Count(); i++)
{
    <tr>
        <td>@Model.List[i].ItemDescription</td>
        <td>
            <input type="submit" value="REMOVE" class="btn btn-xs btn-danger" 
             asp-controller="ControllerName" asp-action="delete" asp-route-idForDeleteItem="@Model.List[i].idForDeleteItem" />
        </td>
    </tr>
}
</table>
</form>

Sur le contrôleur:

[HttpPost("[action]/{idForDeleteItem}"), ActionName("Delete")]
public async Task<IActionResult> DeleteConfirmed(long idForDeleteItem)
{
    ///delete with param id goes here
}

N'oubliez pas d'utiliser [Route("[controller]")] AVANT la déclaration de classe - sur le contrôleur.

0
Pablo

Cette réponse vous montrera comment travailler dans asp.net avec rasoir et contrôler plusieurs événements de bouton de soumission. Par exemple, nous avons deux boutons, l'un nous redirigera vers "PageA.cshtml" et l'autre nous redirigera vers "PageB.cshtml".

@{
  if (IsPost)
    {
       if(Request["btn"].Equals("button_A"))
        {
          Response.Redirect("PageA.cshtml");
        }
      if(Request[&quot;btn"].Equals("button_B"))
        {
          Response.Redirect(&quot;PageB.cshtml&quot;);
        }
  }
}
<form method="post">
   <input type="submit" value="button_A" name="btn"/>;
   <input type="submit" value="button_B" name="btn"/>;          
</form>

0
Pir Fahim Shah