Обработка нескольких кнопок submit в ASP.NET MVC

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Удобный способ работы с несколькими кнопками отправки в ASP.NET MVC осуществляется через контроллер. Присвойте каждой кнопке уникальные значения атрибута name, придерживаясь следующих правил: у каждой кнопки должен быть name="action" и уникальное значение value. В контроллере вам нужно проанализировать параметр action для определения, какая кнопка была нажата.

HTML
Скопировать код
<button type="submit" name="action" value="Send">Отправить</button>
<button type="submit" name="action" value="Cancel">Отменить</button>

Контроллер определяет нажатую кнопку и обрабатывает соответствующее действие:

csharp
Скопировать код
[HttpPost]
public ActionResult MyAction(string action)
{
    switch (action)
    {
        case "Send":
            // Процесс отправки!
            break;
        case "Cancel":
            // Отмена была выбрана.
            break;
    }
    return View();
}

Такой подход позволяет контроллеру чётко и ясно обрабатывать каждую кнопку отправки без необходимости использования дополнительного JavaScript.

Кинга Идем в IT: пошаговый план для смены профессии

Использование атрибутов

С течением времени и ростом приложения формы становятся сложнее. Для обработки таких форм удобны методы, использующие пользовательские атрибуты.

Расширенное использование атрибутов

MultipleButtonAttribute – это атрибут, позволяющий связывать методы действий с определенными кнопками.

csharp
Скопировать код
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;
    }
}

Для эффективного использования методов с атрибутами:

csharp
Скопировать код
[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:

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>

Контроллер запускает соответствующее действие:

csharp
Скопировать код
public ActionResult ControlAction(string action)
{
    switch (action)
    {
        case "approve": // Утверждение транзакции.
            break;
        case "reject": // Отклонение предложения.
            break;
        case "edit": // Редактирование данных.
            break;
        case "delete": // Удаление записи.
            break;
    }
}

Следовательно, форма функционирует в качестве удобной панели управления.

Организация кода в сложных формах и масштабируемость

Сложные формы с множеством кнопок требуют особого подхода к организации кода и его масштабированию.

Шаблоны для масштабируемости

Используйте стратегические шаблоны, инкапсулируя действия отправки в отдельные классы – это улучшает расширяемость форм и облегчает тестирование.

Обработка действий без отправки форм

Для действий, не требующих отправки формы, таких как "Cancel", используйте Html.ActionLink. Это поможет улучшить производительность и сделать URL более чистыми.

Разделение форм для большей ясности

Если форма включает в себя разнообразные действия, стоит подумать о разделении её на отдельные формы. Это делает код кристально чистым и упрощает отслеживание изменений.

Полезные материалы

  1. Как обрабатывать несколько кнопок отправки в ASP.NET MVC Framework? – Stack Overflow — разбор конкретных проблем и их решений, связанных с работой с кнопками в контексте ASP.NET MVC.
  2. Обзор примеров кода | Microsoft Learn — разнообразные официальные примеры привязки моделей в ASP.NET MVC.
  3. Привязка модели к списку | You’ve Been Haacked — особенности привязки моделей для коллекций в ASP.NET MVC.
  4. Статьи | InformIT — ценные материалы по использованию помощника BeginForm в ASP.NET MVC.
  5. C# Corner: MVC Action Selectors in ASP.Net MVC — детальный анализ селекторов действий в ASP.NET MVC и подходов к их обработке.