Yukarıdaki sorunu çözmenin üç yolu vardır.
- HTML yolu
- Jquery yolu
- “ActionNameSelectorAttribute” yolu
Aşağıda, bu üç yaklaşımı da gösterici bir şekilde özetleyen bir video bulunmaktadır.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
HTML yolu: -
HTML yolunda iki form oluşturmamız ve "Gönder" düğmesini formların her birinin içine yerleştirmemiz gerekir. Ve her formun eylemi farklı / ilgili eylemlere işaret edecektir. Aşağıdaki formun, ilk formun "İşlem1" e gönderildiğini ve ikinci formun, "Gönder" düğmesine tıklanmasına bağlı olarak "İşlem2" ye gönderileceğini görebilirsiniz.
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
Ajax yolu: -
Ajax sevgilisi olmanız durumunda bu ikinci seçenek sizi daha fazla heyecanlandıracaktır. Ajax yolunda iki farklı fonksiyon oluşturabiliriz: “Fun1” ve “Fun1”, aşağıdaki koda bakınız. Bu işlevler, JQUERY veya başka bir çerçeve kullanarak Ajax çağrıları yapar. Bu işlevlerin her biri “Gönder” düğmesinin “OnClick” olaylarıyla bağlanır. Bu işlevlerin her biri ilgili eylem adlarını çağırır.
<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>
“ActionNameSelectorAttribute” kullanarak: -
Bu harika ve temiz bir seçenektir. “ActionNameSelectorAttribute”, hangi eylemin yürütülebileceğine karar verecek karar verme mantığını yazabileceğimiz basit bir öznitelik sınıfıdır.
Bu yüzden ilk şey HTML'de, sunucuda tanımlamak için gönderme düğmelerine uygun adlar koymamız gerekiyor.
Düğme adlarına “Kaydet” ve “Sil” ifadelerini eklediğimizi görebilirsiniz. Ayrıca eylemde, belirli bir işlem adı değil, sadece denetleyici adını “Müşteri” koyduğumuzu fark edebilirsiniz. İşlem adının “ActionNameSelectorAttribute” tarafından kararlaştırılmasını bekliyoruz.
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
Gönder düğmesine tıklandığında, önce “ActionNameSelector” özelliğine vurur ve ardından hangi gönderimin tetiklendiğine bağlı olarak uygun eylemi başlatır.
Dolayısıyla ilk adım “ActionNameSelectorAttribute” sınıfından miras alan bir sınıf oluşturmaktır. Bu sınıfta basit bir “Ad” özelliği oluşturduk.
Ayrıca true veya flase döndüren “IsValidName” işlevini de geçersiz kılmamız gerekir. Bu işlev, bir eylemin yürütülmesi gerekip gerekmediği mantığını yazdığımız yerdir. Bu işlev true değerini döndürürse, eylem yürütülür veya yürütülmez.
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;
}
}
Yukarıdaki fonksiyonun ana kalbi aşağıdaki koddadır. “ValueProvider” koleksiyonu formdan gönderilen tüm verilere sahiptir. Bu yüzden önce “Ad” değerini arar ve HTTP isteğinde bulunursa true değerini döndürür veya false değerini döndürür.
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
Bu öznitelik sınıfı daha sonra ilgili eylem üzerinde dekore edilebilir ve ilgili “Ad” değeri sağlanabilir. Dolayısıyla, gönderme bu eylemi gerçekleştiriyorsa ve HTML gönderme düğmesi adıyla eşleşiyorsa, eylemi daha fazla yürütür veya yürütmez.
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}