Hay tres formas de resolver el problema anterior.
- Forma HTML
- Jquery way
- Forma "ActionNameSelectorAttribute"
A continuación se muestra un video que resume los tres enfoques de manera demostrativa.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Forma HTML: -
En la forma HTML, necesitamos crear dos formularios y colocar el botón "Enviar" dentro de cada uno de los formularios. Y la acción de cada formulario apuntará a acciones diferentes / respectivas. Puede ver el siguiente código: el primer formulario se publica en "Acción1" y el segundo formulario se publicará en "Acción2", según el botón "Enviar" que se haga clic.
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
Forma Ajax: -
En caso de que seas un amante del Ajax, esta segunda opción te entusiasmaría más. En la forma Ajax podemos crear dos funciones diferentes "Fun1" y "Fun1", vea el siguiente código. Estas funciones harán llamadas Ajax utilizando JQUERY o cualquier otro marco. Cada una de estas funciones se vincula con los eventos "OnClick" del botón "Enviar". Cada una de estas funciones realiza llamadas a los respectivos nombres de acción.
<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 es una excelente y limpia opción. El "ActionNameSelectorAttribute" es una clase de atributo simple donde podemos escribir la lógica de toma de decisiones que decidirá qué acción se puede ejecutar.
Entonces, lo primero es en HTML, necesitamos poner nombres propios a los botones de envío para identificarlos en el servidor.
Puede ver que hemos puesto "Guardar" y "Eliminar" a los nombres de los botones. También puede notar en la acción que acabamos de poner el nombre del controlador "Cliente" y no un nombre de acción en particular. Esperamos que el nombre de la acción se decida por "ActionNameSelectorAttribute".
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
Entonces, cuando se hace clic en el botón de envío, primero toca el atributo "ActionNameSelector" y luego, dependiendo de qué envío se activa, invoca la acción apropiada.
Entonces, el primer paso es crear una clase que herede de la clase "ActionNameSelectorAttribute". En esta clase hemos creado una propiedad simple "Nombre".
También necesitamos anular la función "IsValidName" que devuelve verdadero o flase. Esta función es donde escribimos la lógica de si una acción tiene que ejecutarse o no. Entonces, si esta función devuelve verdadero, entonces la acción se ejecuta o no.
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;
}
}
El corazón principal de la función anterior está en el siguiente código. La colección "ValueProvider" tiene todos los datos que se han publicado desde el formulario. Por lo tanto, primero busca el valor "Nombre" y, si se encuentra en la solicitud HTTP, devuelve verdadero o, de lo contrario, devuelve falso.
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
Esta clase de atributo se puede decorar en la acción respectiva y se puede proporcionar el valor de "Nombre" respectivo. Entonces, si el envío está presionando esta acción y si el nombre coincide con el nombre del botón de envío HTML, entonces ejecuta la acción más o no lo hace.
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}