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?
c#
asp.net
asp.net-mvc
razor
Coppermill
fonte
fonte
<input name="submit" type="submit" id="submit" value="Save" onclick="saveMethod" />
:?Respostas:
Nomeie os dois botões de envio da mesma forma
Em seguida, no seu controlador, obtenha o valor de envio. Somente o botão clicado passará seu valor.
É claro que você pode avaliar esse valor para executar operações diferentes com um bloco de chave.
fonte
<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ó)E na ação do seu controlador:
fonte
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-net-mvc-multiple-buttons-in-the-same-form.aspx
e o controlador:
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 ...
fonte
você pode identificar o seu botão a partir da etiqueta de nome como abaixo. Você precisa verificar assim no seu controlador
fonte
Aqui está uma maneira realmente agradável e simples de fazê-lo, com instruções muito fáceis de seguir usando um MultiButtonAttribute 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:
Suas ações como esta:
E crie esta classe:
fonte
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:>fonte
Para facilitar, direi que você pode alterar seus botões para o seguinte:
O seu controlador:
fonte
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:
E você deve especificar os nomes dos botões como argumentos na ação como abaixo:
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.
fonte
input[type=submit]
valor que foi acionado, para que todos possam vincular o modelo a uma propriedade com o mesmoname
(ex.action
) E, em seguida, você possa diferenciar os botões com base navalue
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.Você não consegue descobrir usando o Request.Form Collection? Se clicar em processo, o request.form ["process"] não ficará vazio
fonte
Dê o nome aos dois botões e obtenha o valor do formulário.
No lado do controlador:
fonte
Nas páginas do Core 2.2 Razor, esta sintaxe funciona:
fonte
string submit
vs escritastring 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.