Існує три способи вирішити вищезазначене питання
- HTML-спосіб
- Jquery шлях
- Спосіб "ActionNameSelectorAttribute"
Нижче - відео, яке демонстративно резюмує всі три підходи.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
HTML-спосіб: -
HTML-способом нам потрібно створити дві форми і розмістити кнопку «Надіслати» всередині кожної форми. І дія кожної форми вказуватиме на різні / відповідні дії. Ви можете побачити код нижче, коли перша форма надсилається до "Action1", а друга форма буде розміщена в "Action2" залежно від того, на яку кнопку натисніть "Надіслати".
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
Шлях Аякса: -
Якщо ви любитель "Аяксу", цей другий варіант буде вас більше хвилювати. У Ajax способом ми можемо створити дві різні функції «Fun1» та «Fun1», дивіться код нижче. Ці функції здійснюватимуть дзвінки Ajax за допомогою JQUERY або будь-якого іншого фреймворку. Кожна з цих функцій пов’язана з подіями “OnClick” кнопки “Надіслати”. Кожна з цих функцій робить виклик відповідних імен дій.
<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": -
Це чудовий і чистий варіант. "ActionNameSelectorAttribute" - це простий клас атрибутів, де ми можемо записати логіку прийняття рішень, яка вирішить, яку дію можна виконати.
Отже, перше, що в HTML, нам потрібно поставити власне ім'я до кнопок подання для їх ідентифікації на сервері.
Ви можете бачити, що ми поставили назви кнопок "Зберегти" та "Видалити". Також ви можете помітити в дії, що ми просто ввели ім'я контролера "Клієнт", а не конкретну назву дії. Ми очікуємо, що назва дії буде визначена "ActionNameSelectorAttribute".
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
Таким чином, коли натискається кнопка "Надіслати", вона спочатку натискає атрибут "ActionNameSelector", а потім, залежно від того, яке подання відправляється, викликає відповідну дію.
Отже, першим кроком є створення класу, який успадковується від класу «ActionNameSelectorAttribute». У цьому класі ми створили просту властивість "Ім'я".
Нам також потрібно змінити функцію "IsValidName", яка повертає true або flase. Ця функція полягає в тому, коли ми пишемо логіку, чи потрібно виконати дію чи ні. Отже, якщо ця функція повертає істину, тоді дія виконується, або це не так.
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;
}
}
Основне серце вищевказаної функції - у наведеному нижче коді. У колекції "ValueProvider" є всі дані, розміщені з форми. Таким чином, він спочатку шукає значення "Ім'я", і якщо його знайдено в HTTP-запиті, воно повертає істинне, інакше воно повертає помилкове.
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
Потім цей клас атрибутів може бути прикрашений відповідною дією та може бути надано відповідне значення "Ім'я". Тож якщо команда надсилає натискання на цю дію і якщо ім'я відповідає імені кнопки HTML для надсилання, то вона виконує дію далі, інакше вона не виконує.
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}