Есть три способа решения вышеуказанной проблемы.
- 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 путь: -
В случае, если вы любитель Ajax, этот второй вариант больше вас заинтересует. 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. Эта функция - то, где мы пишем логику, должно ли действие быть выполнено или нет. Таким образом, если эта функция возвращает true, то действие выполняется или нет.
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");
}
}