Обработка нескольких кнопок submit в ASP.NET MVC
Быстрый ответ
Удобный способ работы с несколькими кнопками отправки в ASP.NET MVC осуществляется через контроллер. Присвойте каждой кнопке уникальные значения атрибута name
, придерживаясь следующих правил: у каждой кнопки должен быть name="action"
и уникальное значение value
. В контроллере вам нужно проанализировать параметр action
для определения, какая кнопка была нажата.
<button type="submit" name="action" value="Send">Отправить</button>
<button type="submit" name="action" value="Cancel">Отменить</button>
Контроллер определяет нажатую кнопку и обрабатывает соответствующее действие:
[HttpPost]
public ActionResult MyAction(string action)
{
switch (action)
{
case "Send":
// Процесс отправки!
break;
case "Cancel":
// Отмена была выбрана.
break;
}
return View();
}
Такой подход позволяет контроллеру чётко и ясно обрабатывать каждую кнопку отправки без необходимости использования дополнительного JavaScript.
Использование атрибутов
С течением времени и ростом приложения формы становятся сложнее. Для обработки таких форм удобны методы, использующие пользовательские атрибуты.
Расширенное использование атрибутов
MultipleButtonAttribute
– это атрибут, позволяющий связывать методы действий с определенными кнопками.
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
bool isValidName = false;
var keyValue = $"{Name}:{Argument}";
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
// Проверяем, была ли нажата кнопка.
if (value != null)
{
// Связываем нажатие кнопки с соответствующими методами действий.
controllerContext.Controller.ControllerContext.RouteData.Values[actionName] = Argument;
isValidName = true;
}
return isValidName;
}
}
Для эффективного использования методов с атрибутами:
[HttpPost]
[MultipleButton(Name = "action", Argument = "Send")]
public ActionResult Send()
{
// Выполняется процесс отправки...
return View("Success");
}
[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel()
{
// Попробуем ещё раз?
return View();
}
Работа с Razor Pages
Razor Pages в ASP.NET Core упрощают работу с несколькими кнопками отправки с помощью методов обработчиков.
Надёжный и безопасный код
Правильное написание кода, гарантирующего безопасность, также важно, как и разработка функциональных возможностей.
Многоязычная поддержка и безопасность кода
Надёжный код предотвращает XSS-атаки и поддерживает различные языки. Используйте Html.Encode
для безопасной работы с пользовательским вводом и обеспечьте многоязычность, прибегая к ресурсам для кнопок.
Разделение логики действий и элементов интерфейса
Целесообразно разделить логику действий и названия элементов интерфейса, что снизит сложность зависимостей и упростит поддержку кода.
Визуализация
Визуализируйте форму на веб-сайте как панель управления, где каждая кнопка выполняет свою задачу:
Панель управления: [✔️Утвердить] [❌Отклонить] [✏️Редактировать] [🗑️Удалить]
И вот так это выглядит в HTML:
<button name="action" value="approve">✔️ Утвердить</button>
<button name="action" value="reject">❌ Отклонить</button>
<button name="action" value="edit">✏️ Редактировать</button>
<button name="action" value="delete">🗑️ Удалить</button>
Контроллер запускает соответствующее действие:
public ActionResult ControlAction(string action)
{
switch (action)
{
case "approve": // Утверждение транзакции.
break;
case "reject": // Отклонение предложения.
break;
case "edit": // Редактирование данных.
break;
case "delete": // Удаление записи.
break;
}
}
Следовательно, форма функционирует в качестве удобной панели управления.
Организация кода в сложных формах и масштабируемость
Сложные формы с множеством кнопок требуют особого подхода к организации кода и его масштабированию.
Шаблоны для масштабируемости
Используйте стратегические шаблоны, инкапсулируя действия отправки в отдельные классы – это улучшает расширяемость форм и облегчает тестирование.
Обработка действий без отправки форм
Для действий, не требующих отправки формы, таких как "Cancel", используйте Html.ActionLink
. Это поможет улучшить производительность и сделать URL более чистыми.
Разделение форм для большей ясности
Если форма включает в себя разнообразные действия, стоит подумать о разделении её на отдельные формы. Это делает код кристально чистым и упрощает отслеживание изменений.
Полезные материалы
- Как обрабатывать несколько кнопок отправки в ASP.NET MVC Framework? – Stack Overflow — разбор конкретных проблем и их решений, связанных с работой с кнопками в контексте ASP.NET MVC.
- Обзор примеров кода | Microsoft Learn — разнообразные официальные примеры привязки моделей в ASP.NET MVC.
- Привязка модели к списку | You’ve Been Haacked — особенности привязки моделей для коллекций в ASP.NET MVC.
- Статьи | InformIT — ценные материалы по использованию помощника BeginForm в ASP.NET MVC.
- C# Corner: MVC Action Selectors in ASP.Net MVC — детальный анализ селекторов действий в ASP.NET MVC и подходов к их обработке.