Istnieją trzy sposoby rozwiązania powyższego problemu
- Sposób HTML
- Jquery way
- Sposób „ActionNameSelectorAttribute”
Poniżej znajduje się wideo, które podsumowuje wszystkie trzy podejścia w sposób demonstracyjny.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
Sposób HTML: -
W sposób HTML musimy utworzyć dwa formularze i umieścić przycisk „Prześlij” w każdym formularzu. I działanie każdej formy będzie wskazywać na różne / odpowiednie działania. Możesz zobaczyć poniższy kod, który pierwszy formularz publikuje w „Akcji 1”, a drugi formularz w „Akcji 2”, w zależności od kliknięcia przycisku „Prześlij”.
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
Sposób Ajax: -
Jeśli jesteś miłośnikiem Ajax, ta druga opcja bardziej Cię podnieci. W sposób Ajax możemy stworzyć dwie różne funkcje „Fun1” i „Fun1”, patrz poniższy kod. Te funkcje będą wykonywać wywołania Ajax przy użyciu JQUERY lub dowolnego innego frameworka. Każda z tych funkcji jest powiązana ze zdarzeniami „OnClick” przycisku „Prześlij”. Każda z tych funkcji wywołuje odpowiednie nazwy akcji.
<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>
Korzystanie z „ActionNameSelectorAttribute”: -
To świetna i czysta opcja. „ActionNameSelectorAttribute” to prosta klasa atrybutów, w której możemy napisać logikę decyzyjną, która zadecyduje, która akcja może zostać wykonana.
Pierwszą rzeczą jest to, że w HTML musimy nadać odpowiednie nazwy przyciskom przesyłania w celu ich identyfikacji na serwerze.
Widać, że umieściliśmy „Zapisz” i „Usuń” w nazwach przycisków. Możesz również zauważyć, że w akcji właśnie umieściliśmy nazwę kontrolera „Klient”, a nie konkretną nazwę akcji. Oczekujemy, że o nazwie akcji decyduje „ActionNameSelectorAttribute”.
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
Tak więc po kliknięciu przycisku wysyłania najpierw trafia on w atrybut „ActionNameSelector”, a następnie w zależności od tego, które polecenie zostało uruchomione, wywołuje odpowiednią akcję.
Pierwszym krokiem jest więc utworzenie klasy, która dziedziczy po klasie „ActionNameSelectorAttribute”. W tej klasie stworzyliśmy prostą właściwość „Nazwa”.
Musimy również zastąpić funkcję „IsValidName”, która zwraca true lub flase. Ta funkcja zapisuje logikę, czy akcja musi zostać wykonana, czy nie. Jeśli więc ta funkcja zwróci wartość true, akcja zostanie wykonana lub nie.
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;
}
}
Głównym sercem powyższej funkcji jest poniższy kod. Kolekcja „ValueProvider” zawiera wszystkie dane wysłane z formularza. Najpierw sprawdza wartość „Nazwa” i jeśli zostanie znaleziona w żądaniu HTTP, zwraca wartość true lub w przeciwnym razie zwraca wartość false.
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
Tę klasę atrybutów można następnie udekorować odpowiednią akcją i podać odpowiednią wartość „Nazwa”. Więc jeśli przesłanie trafia w tę akcję i jeśli nazwa pasuje do nazwy przycisku HTML przesłania, wówczas wykonuje akcję dalej, w przeciwnym razie nie.
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}