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" />
Na ação do meu controlador, como sei qual foi pressionado?
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" />
Na ação do meu controlador, como sei qual foi pressionado?
Respostas:
Nomeie os dois botões de envio da mesma forma
<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />
Em seguida, no seu controlador, obtenha o valor de 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 operações diferentes com um bloco de chave.
public ActionResult Index(string submit)
{
switch (submit)
{
case "Save":
// Do something
break;
case "Process":
// Do something
break;
default:
throw new Exception();
break;
}
return View();
}
<button type="submit" name="action" value="draft"> Internationalized Save Text </button>
para fins i18n, assim que a corda enfrentando usuário é personalizável, e nomes de forma elemento nunca são expostos diretamente ao usuário (o que é estranho por si só)
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
E na ação do seu 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:
</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 suma, é um botão SUBMIT, mas você escolhe o nome usando o atributo name, é ainda mais poderoso porque você não é obrigado a enviar o nome ou ao botão nos parâmetros do método do controlador, pode chamá-lo como quiser ...
você pode identificar o seu botão a partir da etiqueta de nome como abaixo. Você precisa verificar assim no 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 realmente agradável e simples de fazê-lo, com instruções muito fáceis de seguir usando um MultiButtonAttribute personalizado:
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;
}
}
MultiButtonAttribute
atributo personalizado para permitir a diferenciação entre os botões de envio. Na verdade, é uma ótima idéia.
Arnis L.
tivesse seguido o mesmo conselho, você pode ter notado que ele forneceu exatamente o mesmo link de 4 anos antes:>
// 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" />
O 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 já foi respondido há muito tempo. Minha postagem será útil para quem buscará uma solução como essa. Antes de tudo, tenho que dizer "A solução do WDuffy está totalmente correta" e funciona bem, mas minha solução (que não é minha) será usada em outros elementos e torna a camada de apresentação mais independente do controlador (porque seu controlador depende de "value", usado para mostrar o rótulo do botão, esse recurso é importante para outros idiomas.).
Aqui está a minha solução, dê-lhes 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 envia 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 situações que passam parâmetros às propriedades do modelo. não se incomode e tome a melhor solução para o seu projeto.
input[type=submit]
valor que foi acionado, para que todos possam vincular o modelo a uma propriedade com o mesmo name
(ex. action
) E, em seguida, você possa diferenciar os botões com base na value
sequência dessa sequência, sem a necessidade de introduzir tantas variáveis em sua assinatura . Também reserve um tempo para pensar em formatação / recuo antes de postar.
Dê o nome aos dois botões e obtenha o 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 Core 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)
{
.......
string submit
vs escrita string submit = Request.Form["Submit"];
. Um dos maiores benefícios do Razor Pages e / ou MVC é a legibilidade dos métodos; caso contrário, poderia ser PHP.
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
:?