Lidar com Vários Botões de Envio no ASP.NET MVC
Visão Geral Rápida
Uma maneira conveniente de trabalhar com vários botões de envio no ASP.NET MVC é através do controlador. Atribua valores únicos ao atributo name
de cada botão, seguindo estas regras: cada botão deve ter name="action"
com um value
único. No controlador, você precisa analisar o parâmetro action
para determinar qual botão foi pressionado.
<button type="submit" name="action" value="Enviar">Enviar</button>
<button type="submit" name="action" value="Cancelar">Cancelar</button>
O controlador determina qual botão foi pressionado e lida com a ação correspondente:
[HttpPost]
public ActionResult MinhaAcao(string action)
{
switch (action)
{
case "Enviar":
// Processar envio!
break;
case "Cancelar":
// A escolha foi cancelar.
break;
}
return View();
}
Essa abordagem permite que o controlador gerencie de forma clara e eficaz cada botão de envio, sem a necessidade de JavaScript adicional.
Usando Atributos
À medida que as aplicações crescem, os formulários se tornam mais complexos. Para lidar com esses formulários, métodos que usam atributos personalizados são bastante práticos.
Uso Avançado de Atributos
MultipleButtonAttribute
é um atributo que permite associar métodos de ação a botões específicos.
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
bool isValidName = false;
var keyValue = $"{Name}:{Argument}";
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
// Verifica se o botão foi pressionado.
if (value != null)
{
// Vincula a pressão do botão aos métodos de ação correspondentes.
controllerContext.Controller.ControllerContext.RouteData.Values[actionName] = Argument;
isValidName = true;
}
return isValidName;
}
}
Para usar métodos com atributos de forma eficaz:
[HttpPost]
[MultipleButton(Name = "action", Argument = "Enviar")]
public ActionResult Enviar()
{
// O processo de envio é executado...
return View("Sucesso");
}
[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancelar")]
public ActionResult Cancelar()
{
// Vamos tentar novamente?
return View();
}
Trabalhando com Páginas Razor
As Páginas Razor no ASP.NET Core simplificam o manuseio de vários botões de envio utilizando métodos manipuladores.
Código Confiável e Seguro
Escrever um código adequado que garanta segurança é tão importante quanto desenvolver funcionalidades.
Suporte Multilíngue e Segurança de Código
Um código confiável previne ataques XSS e suporta múltiplos idiomas. Use Html.Encode
para um manuseio seguro da entrada do usuário e garanta suporte multilíngue aproveitando arquivos de recurso para os botões.
Separação da Lógica de Ação e Elementos de UI
É aconselhável separar a lógica de ação dos nomes dos elementos de UI, reduzindo a complexidade da dependência e simplificando a manutenção do código.
Visualização
Visualize o formulário em um site como um painel de controle, onde cada botão realiza sua tarefa:
Painel de Controle: [✔️Aprovar] [❌Rejeitar] [✏️Editar] [🗑️Excluir]
E aqui está como fica em HTML:
<button name="action" value="aprovar">✔️ Aprovar</button>
<button name="action" value="rejeitar">❌ Rejeitar</button>
<button name="action" value="editar">✏️ Editar</button>
<button name="action" value="excluir">🗑️ Excluir</button>
O controlador aciona a ação correspondente:
public ActionResult AcaoControle(string action)
{
switch (action)
{
case "aprovar": // Aprovando uma transação.
break;
case "rejeitar": // Rejeitando uma oferta.
break;
case "editar": // Editando dados.
break;
case "excluir": // Excluindo um registro.
break;
}
}
Assim, o formulário funciona como um painel de controle amigável ao usuário.
Organização do Código em Formulários Complexos e Escalabilidade
Formulários complexos com múltiplos botões exigem uma abordagem especial para a organização do código e escalabilidade.
Padrões para Escalabilidade
Utilize padrões estratégicos encapsulando ações de envio em classes separadas - isso melhora a extensibilidade dos formulários e facilita os testes.
Lidar com Ações Sem Envio de Formulário
Para ações que não requerem envio de formulário, como "Cancelar", use Html.ActionLink
. Isso pode melhorar a performance e manter as URLs mais limpas.
Dividir Formulários para Maior Clareza
Se um formulário inclui ações diversas, considere dividi-lo em formulários separados. Isso mantém o código cristalino e simplifica o acompanhamento de mudanças.
Recursos Úteis
- Como Lidar com Vários Botões de Envio no ASP.NET MVC? - Stack Overflow — uma análise de problemas específicos e soluções relacionadas ao trabalho com botões no contexto do ASP.NET MVC.
- Visão Geral de Exemplos de Código | Microsoft Learn — vários exemplos oficiais de vinculação de modelos no ASP.NET MVC.
- Vinculação de Modelo a uma Lista | Você Foi Chateado — peculiaridades da vinculação de modelo para coleções no ASP.NET MVC.
- Artigos | InformIT — recursos valiosos sobre o uso do helper BeginForm no ASP.NET MVC.
- C# Corner: Seletores de Ação MVC no ASP.Net MVC — uma análise detalhada dos seletores de ação no ASP.NET MVC e abordagens para seu manejo.