Esistono tre modi per risolvere il problema sopra riportato
- Modo HTML
- Modo Jquery
- Modo "ActionNameSelectorAttribute"
Di seguito è riportato un video che riassume in modo dimostrativo tutti e tre gli approcci.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Modo HTML: -
In modo HTML dobbiamo creare due moduli e posizionare il pulsante "Invia" all'interno di ciascuno dei moduli. E l'azione di ogni modulo punterà ad azioni diverse / rispettive. Puoi vedere il codice qui sotto che il primo modulo sta postando su "Action1" e il secondo modulo pubblicherà su "Action2" a seconda del pulsante "Invia".
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
Modo Ajax: -
Se sei un amante dell'Ajax, questa seconda opzione ti entusiasmerebbe di più. Nel modo Ajax possiamo creare due diverse funzioni "Fun1" e "Fun1", vedere il codice seguente. Queste funzioni effettueranno chiamate Ajax utilizzando JQUERY o qualsiasi altro framework. Ognuna di queste funzioni è associata agli eventi "OnClick" del pulsante "Invia". Ognuna di queste funzioni chiama i rispettivi nomi di azione.
<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>
Utilizzando "ActionNameSelectorAttribute": -
Questa è un'ottima e pulita opzione. "ActionNameSelectorAttribute" è una semplice classe di attributi in cui possiamo scrivere una logica decisionale che deciderà quale azione può essere eseguita.
Quindi la prima cosa è in HTML che dobbiamo inserire il nome proprio nei pulsanti di invio per identificarli sul server.
Puoi vedere che abbiamo messo "Salva" e "Elimina" per i nomi dei pulsanti. Inoltre puoi notare nell'azione che abbiamo appena inserito il nome del controller "Cliente" e non un nome di azione particolare. Prevediamo che il nome dell'azione sarà deciso da "ActionNameSelectorAttribute".
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
Pertanto, quando si fa clic sul pulsante di invio, viene innanzitutto colpito l'attributo "ActionNameSelector" e quindi, a seconda di quale invio viene attivato, viene richiamata l'azione appropriata.
Quindi il primo passo è creare una classe che eredita dalla classe "ActionNameSelectorAttribute". In questa classe abbiamo creato una semplice proprietà "Nome".
Dobbiamo inoltre sostituire la funzione "IsValidName" che restituisce true o flase. Questa funzione è dove scriviamo la logica se un'azione deve essere eseguita o meno. Quindi se questa funzione ritorna vera allora l'azione viene eseguita altrimenti non lo è.
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;
}
}
Il cuore principale della funzione sopra è nel codice qui sotto. La raccolta "ValueProvider" contiene tutti i dati che sono stati pubblicati dal modulo. Quindi cerca prima il valore "Nome" e se si trova nella richiesta HTTP restituisce vero oppure restituisce falso.
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
Questa classe di attributi può quindi essere decorata sulla rispettiva azione e può essere fornito il rispettivo valore "Nome". Quindi, se l'invio sta colpendo questa azione e se il nome corrisponde al nome del pulsante di invio HTML, allora esegue ulteriormente l'azione oppure no.
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}