Existem três maneiras pelas quais você pode resolver o problema acima
- Maneira HTML
- Jquery way
- Maneira "ActionNameSelectorAttribute"
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.
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
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.
<Script language="javascript">
function Fun1()
{
$.post(“/Action1”,null,CallBack1);
}
function Fun2()
{
$.post(“/Action2”,null,CallBack2);
}
</Script>
<form action="/Action1" method=post>
<input type=submit name=sub1 onclick=”Fun2()”/>
</form>
<form action="/Action2" method=post>
<input type=submit name=sub2 onclick=”Fun1()”/>
</form>
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".
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
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.
public class SubmitButtonSelector : ActionNameSelectorAttribute
{
public string Name { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
{
// Try to find out if the name exists in the data sent from form
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
}
}
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.
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
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á.
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}