Existe alguma maneira fácil de lidar com vários botões de envio do mesmo formulário? Por exemplo:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>
Alguma idéia de como fazer isso no ASP.NET Framework Beta? Todos os exemplos que pesquisei no Google têm botões únicos.
c#
html
asp.net-mvc
http-post
form-submit
Spoike
fonte
fonte
Respostas:
Aqui está uma solução baseada em atributos, na maior parte limpa, para a questão do botão de envio múltiplo, baseada fortemente na postagem e nos comentários de Maarten Balliauw .
navalha:
e controlador:
Atualização: as páginas do Razor parecem fornecer a mesma funcionalidade pronta para uso. Para um novo desenvolvimento, pode ser preferível.
fonte
return View(viewmodel)
no caso em que seu modelo possui erros, ele tentará retornar uma visualização chamadaSend
ou dependendo do nome do seu argumento.return View("Index", viewModel)
Dê um nome aos botões de envio e inspecione o valor enviado no seu método do controlador:
postando para
EDITAR:
Para estender essa abordagem para trabalhar com sites localizados, isole suas mensagens em outro lugar (por exemplo, compilar um arquivo de recurso para uma classe de recurso fortemente tipada)
Em seguida, modifique o código para que funcione como:
e seu controlador deve ficar assim:
fonte
Você pode verificar o nome na ação conforme mencionado, mas pode considerar se esse é um bom design ou não. É uma boa idéia considerar a responsabilidade da ação e não associar muito esse design aos aspectos da interface do usuário, como nomes de botões. Portanto, considere usar 2 formulários e 2 ações:
Além disso, no caso de "Cancelar", normalmente você não processa o formulário e está indo para um novo URL. Nesse caso, você não precisa enviar o formulário e precisa apenas de um link:
fonte
Eilon sugere que você possa fazer assim:
Eu gosto desse método, pois não depende da propriedade value dos botões de envio, que é mais provável de mudar do que os nomes atribuídos e não requer que o javascript esteja ativado
Veja: http://forums.asp.net/p/1369617/2865166.aspx#2865166
fonte
Acabei de escrever um post sobre isso: Vários botões de envio com o ASP.NET MVC :
Basicamente, em vez de usar
ActionMethodSelectorAttribute
, estou usandoActionNameSelectorAttribute
, o que me permite fingir que o nome da ação é o que eu quero que seja. Felizmente,ActionNameSelectorAttribute
não apenas me faz especificar o nome da ação, mas posso escolher se a ação atual corresponde à solicitação.Então, há a minha classe (btw eu não gosto muito do nome):
Para usar apenas defina um formulário como este:
e controlador com dois métodos
Como você vê, o atributo não requer que você especifique nada. Além disso, o nome dos botões é convertido diretamente nos nomes dos métodos. Além disso (ainda não tentei isso), elas também devem funcionar como ações normais, para que você possa postar diretamente em qualquer uma delas.
fonte
submit
tag da consideração, o que é ideal, pois é um atributo de interface do usuário pura que não deve ter influência no fluxo de controle. Em vez disso, oname
atributo exclusivo de cadasubmit
tag se converte diretamente em um método de ação discreto no seu controlador.é curto e suite:
e faça assim no código antes
Boa sorte.
fonte
Sugiro que as partes interessadas dêem uma olhada na solução de Maarten Balliauw . Eu acho muito elegante.
Caso o link desapareça, ele está usando o
MultiButton
atributo aplicado a uma ação do controlador para indicar a qual botão clicar com o qual a ação deve se relacionar.fonte
Você deve poder nomear os botões e atribuir um valor a eles; em seguida, mapeie esse nome como um argumento para a ação. Como alternativa, use 2 links de ação separados ou 2 formulários.
fonte
Você pode escrever:
E então, na página, verifique se o nome == "Enviar" ou nome == "Cancelar" ...
fonte
Algo que eu não gosto no ActionSelectName é que IsValidName é chamado para todos os métodos de ação no controlador; Não sei por que funciona dessa maneira. Gosto de uma solução em que cada botão tem um nome diferente com base no que faz, mas não gosto do fato de que você precisa ter tantos parâmetros no método de ação quanto botões no formulário. Eu criei uma enumeração para todos os tipos de botão:
Em vez de ActionSelectName, eu uso um ActionFilter:
O filtro encontrará o nome do botão nos dados do formulário e, se o nome do botão corresponder a algum dos tipos de botão definidos na enumeração, ele encontrará o parâmetro ButtonType entre os parâmetros de ação:
e, em vistas, eu posso usar:
fonte
Aqui está o que funciona melhor para mim:
fonte
Também deparei com esse 'problema', mas encontrei uma solução bastante lógica adicionando o
name
atributo Não me lembro de ter esse problema em outros idiomas.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Significando que os seguintes
value
atributos de código podem ser alterados, localizados e internacionalizados sem a necessidade de verificação extra de código, arquivos ou constantes de recursos fortemente tipados.No lado de recebimento, você só precisa verificar se algum dos seus tipos de envio conhecidos não é
null
fonte
Se você não tiver restrições ao uso do HTML 5, poderá usar a
<button>
tag comformaction
Atributo:Referência: http://www.w3schools.com/html5/att_button_formaction.asp
fonte
Se o seu navegador suportar a formação de atributo para botões de entrada (IE 10+, não tenho certeza sobre outros navegadores), o seguinte deverá funcionar:
fonte
Existem três maneiras pelas quais você pode resolver o problema acima
Abaixo está um vídeo que resume todas as três abordagens de maneira demonstrativa.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Maneira HTML: -
No modo HTML, precisamos criar dois formulários e colocar o botão "Enviar" dentro de cada um dos formulários. E a ação de cada formulário apontará para ações diferentes / respectivas. Você pode ver o código abaixo: o primeiro formulário está sendo postado em "Ação1" e o segundo formulário será postado em "Ação2", dependendo de qual botão "Enviar" for clicado.
Maneira do Ajax: -
Caso você seja um amante do Ajax, esta segunda opção o excitará mais. No modo Ajax, podemos criar duas funções diferentes “Fun1” e “Fun1”, veja o código abaixo. Essas funções farão chamadas ao Ajax usando JQUERY ou qualquer outra estrutura. Cada uma dessas funções está vinculada aos eventos "OnClick" do botão "Submit". Cada uma dessas funções chama os respectivos nomes de ação.
Usando "ActionNameSelectorAttribute": -
Esta é uma ótima e limpa opção. O "ActionNameSelectorAttribute" é uma classe de atributo simples onde podemos escrever uma lógica de tomada de decisão que decidirá qual ação pode ser executada.
Portanto, a primeira coisa é em HTML, precisamos colocar nomes próprios nos botões de envio para identificá-los no servidor.
Você pode ver que colocamos "Salvar" e "Excluir" nos nomes dos botões. Além disso, você pode notar na ação que acabamos de colocar o nome do controlador “Cliente” e não um nome de ação específico. Esperamos que o nome da ação seja decidido por "ActionNameSelectorAttribute".
Portanto, quando o botão de envio é clicado, ele primeiro atinge o atributo "ActionNameSelector" e, dependendo de qual envio é acionado, invoca a ação apropriada.
Portanto, o primeiro passo é criar uma classe que herda da classe "ActionNameSelectorAttribute". Nesta classe, criamos uma propriedade simples "Nome".
Também precisamos substituir a função "IsValidName" que retorna true ou flase. Essa função é onde escrevemos a lógica se uma ação deve ser executada ou não. Portanto, se essa função retornar verdadeira, a ação será executada ou não.
O coração principal da função acima está no código abaixo. A coleção "ValueProvider" possui todos os dados que foram postados no formulário. Então, ele primeiro procura o valor "Nome" e, se encontrado na solicitação HTTP, retorna verdadeiro ou falso.
Essa classe de atributo pode ser decorada na ação respectiva e o respectivo valor "Nome" pode ser fornecido. Portanto, se o envio estiver atingindo essa ação e se o nome corresponder ao nome do botão de envio em HTML, ele executará a ação ainda mais, caso contrário não o fará.
fonte
David Findley escreve cerca de três opções diferentes que você tem para fazer isso, em seu blog ASP.Net.
Leia o artigo vários botões da mesma forma para ver suas soluções e as vantagens e desvantagens de cada um. IMHO ele fornece uma solução muito elegante que utiliza atributos com os quais você decora sua ação.
fonte
Essa é a técnica que eu usaria e ainda não a vejo aqui. O link (publicado por Saajid Ismail) que inspira esta solução é http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Adapta a resposta de Dylan Beattie para fazer a localização sem problemas.
Na vista:
No controlador:
fonte
<input>
elementos. Eu uso<button>
, o que é necessário para fazer a localização sem ter atributos de valor variável.Este script permite especificar um atributo de ação de formulário de dados que funcionará como o atributo de formação HTML5 em todos os navegadores (de maneira discreta):
O formulário que contém o botão será postado no URL especificado no atributo data-form-action:
Isso requer o jQuery 1.7. Para versões anteriores, você deve usar em
live()
vez deon()
.fonte
Aqui está um método de extensão que escrevi para lidar com vários botões de imagem e / ou texto.
Aqui está o HTML para um botão de imagem:
ou para um botão de envio de texto:
Aqui está o método de extensão que você chama do controlador
form.GetSubmitButtonName()
. Para botões de imagem, procura um parâmetro de formulário com.x
(que indica que um botão de imagem foi clicado) e extrai o nome. Parainput
botões regulares , procura um nome que comece comSubmit_
e extrai o comando posteriormente. Como estou abstraindo a lógica de determinar o 'comando', você pode alternar entre botões de imagem + texto no cliente sem alterar o código do servidor.Nota: Para botões de texto, você deve prefixar o nome com
Submit_
. Eu prefiro assim, pois significa que você pode alterar o valor do texto (exibição) sem precisar alterar o código. Ao contrário dosSELECT
elementos, umINPUT
botão possui apenas um atributo 'value' e nenhum atributo 'text' separado. Meus botões dizem coisas diferentes em contextos diferentes - mas são mapeados para o mesmo 'comando'. Eu prefiro extrair o nome dessa maneira do que ter que codificar== "Add to cart"
.fonte
Não tenho representante suficiente para comentar no lugar correto, mas passei o dia todo nisso, então quero compartilhar.
Ao tentar implementar a solução "MultipleButtonAttribute"
ValueProvider.GetValue(keyValue)
, você retornaria incorretamentenull
.Aconteceu que eu estava fazendo referência à System.Web.MVC versão 3.0 quando deveria ter sido 4.0 (outros assemblies são 4.0). Não sei por que meu projeto não foi atualizado corretamente e não tive outros problemas óbvios.
Portanto, se o seu
ActionNameSelectorAttribute
não estiver funcionando ... verifique isso.fonte
Estou muito atrasado para a festa, mas aqui vai ... Minha implementação é emprestada do @mkozicki, mas requer menos strings codificadas para que você se engane. Framework 4.5+ necessário . Essencialmente, o nome do método do controlador deve ser a chave do roteamento.
Marcação . O nome do botão deve ser digitado com
"action:[controllerMethodName]"
(Observe o uso do C # 6 nameof API, proporcionando referência de tipo específico para o nome do método de controlador que você deseja executar.
Controlador :
Atributo Magia . Observe o uso da
CallerMemberName
bondade.fonte
fonte
Tentei fazer uma síntese de todas as soluções e criei um atributo [ButtenHandler] que facilita o manuseio de vários botões em um formulário.
Eu o descrevi no CodeProject Multiple parametrizado (localizável) botões de formulário no ASP.NET MVC .
Para lidar com o caso simples deste botão:
Você terá algo como o seguinte método de ação:
Observe como o nome do botão corresponde ao nome do método de ação. O artigo também descreve como ter botões com valores e botões com índices.
fonte
fonte
esta é a melhor maneira que eu encontrei:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Aqui está o código:
Desfrute de um futuro botão de envio múltiplo sem cheiro de código.
obrigado
fonte
Versão modificada do
HttpParamActionAttribute
método, mas com uma correção de bug por não causar um erro nas postagens de sessão expiradas / inválidas. Para verificar se esse é um problema com o site atual, abra o formulário em uma janela e antes de clicarSave
ouPublish
abrir uma janela duplicada e sair. Agora volte à sua primeira janela e tente enviar seu formulário usando qualquer um dos botões. Para mim, recebi um erro, então essa alteração resolve esse problema para mim. Omiti um monte de coisas por uma questão de brevidade, mas você deve entender. As partes principais são a inclusão deActionName
no atributo e garantir que o nome passado seja o nome da exibição que mostra o formulárioClasse de Atributo
Controlador
Visão
fonte
Minha abordagem JQuery usando um método de extensão:
Você pode usá-lo assim:
E renderiza assim:
fonte
Para cada botão de envio, basta adicionar:
fonte
Com base na resposta mkozicki, venho com uma solução um pouco diferente. Eu ainda uso,
ActionNameSelectorAttribute
mas precisava lidar com dois botões 'Salvar' e 'Sincronizar'. Eles fazem quase o mesmo, então eu não queria ter duas ações.atributo :
Visão
controlador
Também quero ressaltar que, se as ações fizerem coisas diferentes, eu provavelmente seguiria o post mkozicki.
fonte
Eu criei um método ActionButton para o HtmlHelper . Ele gerará um botão de entrada normal com um pouco de javascript no evento OnClick que enviará o formulário para o Controlador / Ação especificado.
Você usa o ajudante assim
isso irá gerar o seguinte HTML
Aqui está o código do método de extensão:
VB.Net
C # (o código C # é apenas descompilado da DLL do VB, para que possa ser embelezado ... mas o tempo é tão curto :-))
Esses métodos têm vários parâmetros, mas, para facilitar o uso, você pode criar uma sobrecarga que utiliza apenas os parâmetros necessários.
fonte