Как лучше всего разрешить использование нескольких кнопок в форме ASP.NET MVC?

У меня такое чувство, что я слишком "зацикливаюсь" на этом, но я все равно спрошу. У меня есть форма в проекте ASP.NET MVC, в которой есть несколько полей ввода и две кнопки. Одна кнопка используется для «фильтрации» одного из списков. Другой используется для отправки формы. Моя точка зрения выглядит примерно так:

<%using (Html.BeginForm())
  {%>
   <%=Html.TextBox("SearchItems") %>
   <input type = "submit" name = "Command" value = "Find" />
   <%=Html.ListBox("SelectedItems", new MultiSelectList(model.AvailableItems,"Id", "Name", model.SelectedItems))%>
   //Some other form fields.
   <input type = "submit" name = "Command" value = "Send" />
    <%} %>

Мое действие выглядит примерно так:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix = "")]SendMessageRequest model)
    {
        if (model.Command == "Find")
            return SearchItems(model);
        if (model.Command == "Send")
            return Send(model);
        throw new Exception("Invalid command.");
    }

Это работает - контроллер выбирает правильное действие на основе нажатой кнопки. Однако это не идеально, потому что значение кнопки ввода также является отображаемым текстом. Если бы я хотел перевести это приложение, то действие сломалось бы. Чтобы обойти это, я могу использовать элемент <button>, который позволяет тексту и значению различаться. Однако это приложение предназначено для Pocket IE, и, очевидно, Pocket IE обрабатывает их по-другому - он отправляет значения оба для Command, что прерывает действие.

Поскольку это для Pocket IE, я также довольно ограничен в том, что я могу делать с помощью JavaScript. Ajax отсутствует, но я мог бы установить скрытое поле в кнопках onClick.

Итак, мой вопрос: как лучше всего разрешить одну форму с несколькими кнопками в представлении MVC? В качестве альтернативы, следует ли мне как-то разбить свое представление на несколько форм?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 494
4

Ответы 4

Нет необходимости в скрытом поле, вы можете настроить действие формы на событие нажатия кнопки.

JavaScript (в jQuery) выглядит примерно так:

$("#myForm").attr("action", "mvcaction");
$("#myForm").submit();

Вы можете заключить это в стандартную функцию, которая принимает параметр, например действие. Мы используем это для стандартных пунктов меню в объекте формы меню, это работает довольно хорошо.

Обновлено: Не уверен, что Pocket PC вообще обрабатывает JQuery, хотя, если это не так, должно быть возможно сделать это в обычном javascript.

Я бы предложил несколько форм с двумя разными действиями. Я думаю, что это также более проверено:

(c => c.Search(), FormMethod.Get); { %> Find (c => c.Send(), FormMethod.Post); { %> Send

или что-то типа того. Тогда в контроллере у вас есть 2 соответствующих действия. Это означает, что ответственность снята. В MVC у вас может быть несколько форм, в отличие от Webforms. Так что вы можете вырваться на свободу!

это также должно устранить проблему поддержки javascript

Trevor de Koekkoek 18.12.2008 02:28

Проблема с этим подходом заключается в том, что в этом случае форма «Поиск» должна быть внутри, формой «Отправить», и все значения на странице должны сохраняться. В этом решении, если пользователь вводит что-то в форме отправки, а затем выполняет поиск, форма отправки теряет свое состояние (кроме FireFox).

Daniel 18.12.2008 18:34

Вот очень хорошая статья, описывающая все альтернативы для форм с несколькими кнопками: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

Лично я согласен с Odd, действия jQuery onclick кажутся лучшим вариантом.

Но тогда вы полагаетесь на JavaScript для управления поведением страницы. Страницы должны нормально работать с отключенным JavaScript, так что это было бы не идеально.

Kezzer 30.06.2009 15:30

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

Мы обошли его с помощью метода $ .post () из библиотеки jQuery.

$("#update").click(function() {
                $.post("/Register", { name: $("#firstName").val(),
                    surname: $("#surname").val(),
                    username: $("#email").val(),
                    accountName: $("#accountName").val(),
                    password: $("#password").val()
                },
                  function(data) {
                      alert(data);
                  });
            });

А кнопка отмены отправила обратно меньше значений.

$("#cancel").click(function() {
                $.post("/Cancel", { username: $("#email").val(),
                    password: $("#password").val()
                },
                  function(data) {
                      alert(data);
                  });
            }); 

Хорошо, снова это зависит от включения javascript, но если вы собираетесь отключить javascript, вам лучше не использовать Интернет (и мое приложение, потому что оно будет тяжелым для js).

Другие вопросы по теме