Есть ли простой способ обработки нескольких кнопок отправки из одной формы? Например:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" value="Send" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>
Любая идея, как сделать это в ASP.NET Framework Beta? Все примеры, на которые я гуглил, содержат отдельные кнопки.
c#
html
asp.net-mvc
http-post
form-submit
Spoike
источник
источник
Ответы:
Вот в основном чистое, основанное на атрибутах решение проблемы с несколькими кнопками отправки, основанное на публикации и комментариях от Мартена Баллиау .
бритва:
и контроллер:
Обновление: Razor страниц выглядит так, чтобы обеспечить ту же функциональность из коробки. Для новых разработок это может быть предпочтительнее.
источник
return View(viewmodel)
в случае, когда в вашей модели есть ошибки, она попытается вернуть вызванное представлениеSend
или в зависимости от того, как называется ваш аргумент.return View("Index", viewModel)
Дайте вашим кнопкам отправки имя, а затем проверьте отправленное значение в методе вашего контроллера:
отправка в
РЕДАКТИРОВАТЬ:
Чтобы расширить этот подход для работы с локализованными сайтами, изолируйте свои сообщения где-то еще (например, скомпилируйте файл ресурса в строго типизированный класс ресурса)
Затем измените код так, чтобы он работал так:
и ваш контроллер должен выглядеть так:
источник
Вы можете проверить имя в действии, как было упомянуто, но вы можете решить, является ли это хорошим дизайном. Хорошая идея - рассмотреть ответственность за действие и не связывать этот дизайн слишком сильно с такими аспектами пользовательского интерфейса, как названия кнопок. Итак, рассмотрим использование 2 форм и 2 действий:
Кроме того, в случае «Отмена» вы обычно просто не обрабатываете форму и переходите на новый URL. В этом случае вам не нужно отправлять форму вообще, а просто нужна ссылка:
источник
Эйлон предлагает вам сделать это так:
Мне нравится этот метод, так как он не зависит от значения свойства кнопок отправки, которое с большей вероятностью изменится, чем назначенные имена, и не требует включения JavaScript
См .: http://forums.asp.net/p/1369617/2865166.aspx#2865166
источник
Только что написал пост об этом: несколько кнопок отправки с ASP.NET MVC :
По сути, вместо использования
ActionMethodSelectorAttribute
я используюActionNameSelectorAttribute
, что позволяет мне притворяться, что имя действия - это то, что я хочу. К счастью,ActionNameSelectorAttribute
не просто указываю имя действия, а могу выбрать, соответствует ли текущее действие запросу.Так что есть мой класс (кстати, я не слишком люблю имя):
Чтобы использовать просто определить форму, как это:
и контроллер с двумя методами
Как видите, атрибут вообще не требует указывать что-либо. Кроме того, названия кнопок переводятся непосредственно в названия методов. Кроме того (я не пробовал это), они также должны работать как обычные действия, так что вы можете публиковать сообщения на любом из них напрямую.
источник
submit
тега из рассмотрения, который является идеальным , поскольку он является атрибутом чистого пользовательского интерфейса , который не должен иметь никакого отношения к потоку управления. Вместо этого уникальныйname
атрибут каждогоsubmit
тега преобразуется непосредственно в метод дискретного действия на вашем контроллере.это короткий и набор:
и делать это в коде
Удачи.
источник
Я хотел бы предложить заинтересованным сторонам взглянуть на решение Maarten Balliauw . Я думаю, что это очень элегантно.
Если ссылка исчезает, она использует
MultiButton
атрибут, примененный к действию контроллера, чтобы указать, к какому нажатию кнопки должно относиться это действие.источник
Вы должны быть в состоянии назвать кнопки и дать им значение; затем сопоставьте это имя в качестве аргумента действия. В качестве альтернативы, используйте 2 отдельные action-ссылки или 2 формы.
источник
Вы могли бы написать:
А затем на странице проверьте, если имя == «Отправить» или имя == «Отмена» ...
источник
Что мне не нравится в ActionSelectName, так это то, что IsValidName вызывается для каждого метода действия в контроллере; Я не знаю, почему это так работает. Мне нравится решение, в котором каждая кнопка имеет свое имя в зависимости от того, что она делает, но мне не нравится тот факт, что у вас должно быть столько параметров в методе действия, сколько кнопок в форме. Я создал перечисление для всех типов кнопок:
Вместо ActionSelectName я использую ActionFilter:
Фильтр найдет имя кнопки в данных формы и, если имя кнопки соответствует любому из типов кнопок, определенных в перечислении, он найдет параметр ButtonType среди параметров действия:
и тогда во взглядах я могу использовать:
источник
Вот что работает лучше всего для меня:
источник
Я также столкнулся с этой «проблемой», но нашел довольно логичное решение, добавив
name
атрибут. Я не могу вспомнить, чтобы эта проблема возникла на других языках.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
Это означает, что следующие
value
атрибуты кода могут быть изменены, локализованы, интернационализированы без необходимости дополнительной проверки кода строго типизированных файлов ресурсов или констант.На получающем конце вам нужно будет только проверить, не является ли какой-либо из ваших известных типов отправки не
null
источник
Если у вас нет ограничений на использование HTML 5, вы можете использовать
<button>
тег сformaction
атрибутом:Ссылка: http://www.w3schools.com/html5/att_button_formaction.asp
источник
Если ваш браузер поддерживает формирование атрибутов для кнопок ввода (IE 10+, не уверен в других браузерах), то должно работать следующее:
источник
Есть три способа решения вышеуказанной проблемы.
Ниже приведено видео, в котором кратко излагаются все три подхода.
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
HTML способ: -
В HTML-формате нам нужно создать две формы и поместить кнопку «Отправить» внутри каждой из форм. И действие каждой формы будет указывать на различные / соответствующие действия. Ниже показан код, который первая форма публикует в «Action1», а вторая - в «Action2» в зависимости от того, какая кнопка «Отправить» нажата.
Ajax путь: -
В случае, если вы любитель Ajax, этот второй вариант больше вас заинтересует. Ajax-способом мы можем создать две разные функции «Fun1» и «Fun1», см. Код ниже. Эти функции будут выполнять вызовы Ajax с использованием JQUERY или любого другого фреймворка. Каждая из этих функций связана с событиями OnClick кнопки «Отправить». Каждая из этих функций вызывает соответствующие имена действий.
Используя «ActionNameSelectorAttribute»: -
Это отличный и чистый вариант. ActionNameSelectorAttribute - это простой класс атрибутов, в котором мы можем написать логику принятия решения, которая будет определять, какое действие может быть выполнено.
Итак, первое, что нужно сделать в HTML, это указать имена кнопок для отправки на сервер.
Вы можете видеть, что мы поместили «Сохранить» и «Удалить» в названия кнопок. Также вы можете заметить, что в действии мы просто указали имя контроллера «Клиент», а не конкретное имя действия. Мы ожидаем, что имя действия будет определяться «ActionNameSelectorAttribute».
Поэтому, когда нажимается кнопка «Отправить», она сначала попадает в атрибут «ActionNameSelector», а затем, в зависимости от того, какая отправка запущена, вызывает соответствующее действие.
Поэтому первым шагом является создание класса, который наследуется от класса «ActionNameSelectorAttribute». В этом классе мы создали простое свойство «Имя».
Нам также нужно переопределить функцию «IsValidName», которая возвращает true или flase. Эта функция - то, где мы пишем логику, должно ли действие быть выполнено или нет. Таким образом, если эта функция возвращает true, то действие выполняется или нет.
Основное назначение этой функции - в приведенном ниже коде. Коллекция «ValueProvider» содержит все данные, отправленные из формы. Поэтому он сначала ищет значение «Имя» и, если оно найдено в HTTP-запросе, возвращает значение «истина» или возвращает «ложь».
Этот класс атрибута затем может быть оформлен на соответствующее действие, и может быть предоставлено соответствующее значение «Имя». Таким образом, если отправка выполняет это действие и если имя соответствует названию кнопки отправки HTML, оно выполняет действие дальше или не выполняет.
источник
Дэвид Финдли (David Findley) пишет о 3 различных вариантах для этого в своем блоге ASP.Net.
Прочитайте в статье несколько кнопок в одной форме, чтобы увидеть его решения, а также преимущества и недостатки каждой из них. ИМХО, он предлагает очень элегантное решение, которое использует атрибуты, которыми вы украшаете свое действие.
источник
Это техника, которую я бы использовал, и я пока не вижу ее здесь. Ссылка (опубликованная Saajid Ismail), которая вдохновляет это решение, является http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form .aspx ). Это адаптирует ответ Дилана Битти, чтобы сделать локализацию без каких-либо проблем.
В представлении:
В контроллере:
источник
<input>
элементы. Я использую<button>
, что требуется, чтобы сделать локализацию без атрибутов значения переменной.Этот скрипт позволяет указать атрибут data-form-action, который будет работать как атрибут формирования HTML5 во всех браузерах (ненавязчиво):
Форма, содержащая кнопку, будет размещена по URL-адресу, указанному в атрибуте data-form-action:
Это требует jQuery 1.7. Для предыдущих версий вы должны использовать
live()
вместоon()
.источник
Вот метод расширения, который я написал для обработки нескольких кнопок изображения и / или текста.
Вот HTML-код для кнопки с изображением:
или для кнопки отправки текста:
Вот метод расширения, который вы вызываете из контроллера
form.GetSubmitButtonName()
. Для кнопок изображения он ищет параметр формы с.x
(который указывает на нажатие кнопки изображения) и извлекает имя. Для обычныхinput
кнопок он ищет имя, начинающееся с,Submit_
и извлекает команду после. Поскольку я абстрагируюсь от логики определения «команды», вы можете переключаться между кнопками image + text на клиенте, не меняя код на стороне сервера.Примечание. Для текстовых кнопок необходимо добавить префикс имени
Submit_
. Я предпочитаю этот способ, потому что это означает, что вы можете изменить значение текста (отображения) без необходимости изменения кода. В отличие отSELECT
элементов,INPUT
кнопка имеет только «значение» и не имеет отдельного атрибута «текст». Мои кнопки говорят разные вещи в разных контекстах - но отображаются на одну и ту же «команду». Я предпочитаю извлекать имя таким образом, чем кодировать== "Add to cart"
.источник
У меня недостаточно представителей, чтобы комментировать в правильном месте, но я потратил на это целый день, поэтому хочу поделиться.
При попытке реализовать решение «MultipleButtonAttribute»
ValueProvider.GetValue(keyValue)
будет возвращаться неправильноnull
.Оказалось, что я ссылался на System.Web.MVC версии 3.0, когда она должна была быть 4.0 (другие сборки - 4.0). Я не знаю, почему мой проект не обновился правильно, и у меня не было других очевидных проблем.
Так что, если ваш
ActionNameSelectorAttribute
не работает ... проверьте это.источник
Я довольно поздно на вечеринку, но здесь идет ... Моя реализация заимствует из @mkozicki, но требует меньше жестко закодированных строк, чтобы ошибиться. Framework 4.5+ требуется . По сути, имя метода контроллера должно быть ключом к маршрутизации.
Разметка . Имя кнопки должно быть набрано с
"action:[controllerMethodName]"
(обратите внимание на использование C # 6 nameof API, предоставляющего специфическую для типа ссылку на имя метода контроллера, который вы хотите вызвать.
Контроллер :
Атрибут Магия . Обратите внимание на использование
CallerMemberName
добра.источник
источник
Я попытался объединить все решения и создал атрибут [ButtenHandler], который позволяет легко обрабатывать несколько кнопок в форме.
Я описал это на многопараметрических (локализуемых) кнопках форм CodeProject в ASP.NET MVC .
Чтобы обработать простой случай этой кнопки:
У вас будет что-то вроде следующего метода действия:
Обратите внимание, как имя кнопки совпадает с именем метода действия. В статье также описано, как иметь кнопки со значениями и кнопки с индексами.
источник
источник
это лучший способ, который я нашел:
http://iwayneo.blogspot.co.uk/2013/10/aspnet-mvc-action-selector-with-list.html
Вот код:
Наслаждайтесь несколькими кнопками отправки без запаха.
благодарю вас
источник
Модифицированная версия
HttpParamActionAttribute
метода, но с исправлением ошибки, которая не вызывала ошибку при истечении / недействительных обратных передачах сеанса. Чтобы увидеть, если это проблема с вашим текущим сайтом, откройте вашу форму в окне и перед тем, как нажатьSave
илиPublish
, откройте дублирующееся окно и выйдите из системы. Вернитесь к первому окну и попробуйте отправить форму, используя любую кнопку. Для меня я получил ошибку, так что это изменение решает эту проблему для меня. Я опускаю кучу вещей для краткости, но вы должны понять. Ключевыми частями являются включениеActionName
атрибута и проверка того, что переданное имя является именем представления, отображающего формуАтрибут Класс
контроллер
Посмотреть
источник
Мой подход JQuery с использованием метода расширения:
Вы можете использовать это так:
И это выглядит так:
источник
Для каждой кнопки отправки просто добавьте:
источник
На основании ответа mkozicki я придумаю немного другое решение. Я все еще использую
ActionNameSelectorAttribute
Но мне нужно было обработать две кнопки «Сохранить» и «Синхронизировать». Они делают почти то же самое, поэтому я не хотел иметь два действия.атрибут :
Посмотреть
контроллер
Я также хочу отметить, что если действия делают разные вещи, я бы, вероятно, следовал за постом mkozicki.
источник
Я создал метод ActionButton для HtmlHelper . Он сгенерирует обычную кнопку ввода с небольшим количеством javascript в событии OnClick , которое отправит форму указанному контроллеру / действию.
Вы используете помощника, как это
это сгенерирует следующий HTML
Вот код метода расширения:
VB.Net
C # (код C # просто декомпилируется из VB DLL, поэтому он может получить некоторое украшение ... но время так мало :-))
Эти методы имеют различные параметры, но для простоты использования вы можете создать некоторую перегрузку, которая принимает только те параметры, которые вам нужны.
источник