Pergunta

Eu tenho dois botões no meu formulário MVC:

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

Da ação do meu controlador, como sei qual foi pressionado?

Foi útil?

Solução

Nomeie os dois botões de envio iguais

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

Então, no seu controlador, obtenha o valor do envio. Somente o botão clicado passará seu valor.

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

É claro que você pode avaliar esse valor para executar diferentes operações com um bloco de comutação.

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

    return View();
}

Outras dicas

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

E em sua ação do controlador:

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

Esta é uma resposta melhor, para que possamos ter texto e valor para um botão:

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

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

e o controlador:

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

Em resumo, é um botão de envio, mas você escolhe o nome usando o atributo de nome, é ainda mais poderoso porque você não é obrigado ao nome Enviar ou botão nos parâmetros do método do controlador, você pode chamá -lo como quiser ...

Você pode identificar seu botão a partir da tag de nome, como abaixo, você precisa verificar assim em seu controlador

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

Aqui está uma maneira muito agradável e simples de fazê -lo com instruções realmente fáceis de seguir, usando um multifuncional personalizado:

http://blog.maartenballiauw.be/post/2009/11/26/supporting-multiple-submit-buttons-on-an-aspnet-mvc-view.aspx

Para resumir, faça seus botões de envio como este:

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

Suas ações como esta:

[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");
} 

E crie esta 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

Para facilitar, direi que você pode alterar seus botões para o seguinte:

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

Seu controlador:

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

Este post não vai responder a Coppermill, porque ele foi respondido há muito tempo. Minha postagem será útil para quem procurará uma solução como essa. Primeiro de tudo, devo dizer que "a solução de Wduffy está totalmente correta" e funciona bem, mas minha solução (na verdade não minha) será usada em outros elementos e torna a camada de apresentação mais independente do controlador (porque seu controlador depende de dependente de "Valor", que é usado para mostrar o rótulo do botão, esse recurso é importante para outros idiomas.).

Aqui está minha solução, dê a eles nomes diferentes:

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

E você deve especificar os nomes dos botões como argumentos na ação como abaixo:

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

Quando o usuário enviar a página usando um dos botões, apenas um dos argumentos terá valor. Eu acho que isso será útil para os outros.

Atualizar

Essa resposta é bastante antiga e eu realmente reconsiderei minha opinião. Talvez a solução acima seja boa para a situação que passa o parâmetro para as propriedades do modelo. Não se preocupe e tome a melhor solução para o seu projeto.

Dê o nome a ambos os botões e obtenha a verificação do valor do formulário.

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

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

No lado do controlador:

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

Nas páginas do núcleo 2.2 Razor, esta sintaxe funciona:

    <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)
       {
       .......

Você não pode descobrir usando a coleta de request.form.form? Se o processo for clicado no request.form ["processo"] não estará vazio

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top