Форме отправки сообщения для разных почтовых действие MVC, в зависимости от того, нажата кнопка "Отправить"
Я использую ASP.Net MVC 4
. У меня есть несколько кнопок на вид.. В настоящее время я вызываю тот же метод действия; и я различаю нажатую кнопку с помощью .
@using (Html.BeginForm("Submit", "SearchDisplay", new { id = Model == null ? Guid.NewGuid().ToString() : Model.SavedSearch }, FormMethod.Post))
{
<div class="leftSideDiv">
<input type="submit" id="btnExport" class="exporttoexcelButton"
name="Command" value="Export to Excel" />
</div>
<div class="pageWrapperForSearchSubmit">
<input type="submit" class="submitButton"
value="Submit" id="btnSubmitChange" />
</div>
}
/ / ACTION
[HttpPost]
public ActionResult Submit(SearchCostPage searchModel, string Command)
{
SessionHelper.ProjectCase = searchModel.ProjectCaseNumber;
if (string.Equals(Command, Constants.SearchPage.ExportToExcel))
{
}
}
вопросы
- есть ли способ направить на различные методы действия POST при разных щелчках кнопки (без пользовательской маршрутизации)?
- если нет никакого способа без пользовательской маршрутизации, как мы можем это сделать с пользовательской маршрутизации?
ссылки:
4 ответа:
вы можете выбрать url, где должна быть размещена форма (и, следовательно, вызванное действие) по-разному, в зависимости от поддержки браузера:
- для новых браузеров, поддерживающих HTML5, вы можете использовать атрибут formaction кнопки отправки
- для старых браузеров, которые не поддерживают это, вам нужно использовать некоторый JavaScript, который изменяет формы, когда кнопка нажата, и раньше представления
в этом случае вам не нужно делать ничего особенного на стороне сервера.
конечно, вы можете использовать
Url
методы расширений в вашей бритве, чтобы указать действие формы.для браузеров, поддерживающих HMTL5: просто определите свои кнопки отправки следующим образом:
<input type='submit' value='...' formaction='@Url.Action(...)' />
для старых браузеров я рекомендую использовать ненавязчивый скрипт вроде этого (включить его в свой "мастер макет"):
$(document).on('click', '[type="submit"][data-form-action]', function (event) { var $this = $(this); var formAction = $this.attr('data-form-action'); $this.closest('form').attr('action', formAction); });
Примечание: этот скрипт будет обрабатывать щелчок для любого элемента на странице, которая имеет
type=submit
иdata-form-action
атрибуты. Когда это происходит, он принимает значениеdata-form-action
атрибут и установите действие содержащей формы в значение этого атрибута. Поскольку это делегированное событие, оно будет работать даже для HTML, загруженного с помощью AJAX, без дополнительных шагов.тогда вам просто нужно добавить
data-form-action
атрибут с требуемым URL-адресом действия ваша кнопка, вот так:<input type='submit' data-form-action='@Url.Action(...)' value='...'/>
обратите внимание, что нажатие кнопки изменяет действие формы, и сразу после этого браузер отправляет форму на нужное действие.
как вы можете видеть, это не требует специальной маршрутизации, вы можете использовать стандартный
Url
методы расширения, и вы не имеете ничего особенного, чтобы сделать в современных браузерах.
ЛУЧШИЙ ОТВЕТ 1:
ActionNameSelectorAttribute
упомянутые вответ 2
ссылки: dotnet-трюки-обработка нескольких кнопок отправки на одной форме-MVC Razor
Второй Подход
добавление новой формы для обработки нажатия кнопки Отмена. Теперь, на отмене нажмите кнопку мы разместим вторую форму и перенаправим на главную страницу.
Третий Подход: Клиентский Скрипт
<button name="ClientCancel" type="button" onclick=" document.location.href = $('#cancelUrl').attr('href');">Cancel (Client Side) </button> <a id="cancelUrl" href="@Html.AttributeEncode(Url.Action("Index", "Home"))" style="display:none;"></a>
это звучит для меня как то, что у вас есть одна команда с 2 выходами, я бы выбрал для внесения изменений в и клиент и сервер для этого.
на клиенте используйте JS для создания URL-адреса, который вы хотите опубликовать (используйте JQuery для простоты), т. е.
<script type="text/javascript"> $(function() { // this code detects a button click and sets an `option` attribute // in the form to be the `name` attribute of whichever button was clicked $('form input[type=submit]').click(function() { var $form = $('form'); form.removeAttr('option'); form.attr('option', $(this).attr('name')); }); // this code updates the URL before the form is submitted $("form").submit(function(e) { var option = $(this).attr("option"); if (option) { e.preventDefault(); var currentUrl = $(this).attr("action"); $(this).attr('action', currentUrl + "/" + option).submit(); } }); }); </script> ... <input type="submit" ... /> <input type="submit" name="excel" ... />
теперь на стороне сервера мы можем добавить новый маршрут для обработки запроса excel
routes.MapRoute( name: "ExcelExport", url: "SearchDisplay/Submit/excel", defaults: new { controller = "SearchDisplay", action = "SubmitExcel", });
вы можете настроить 2 различных действия
public ActionResult SubmitExcel(SearchCostPage model) { ... } public ActionResult Submit(SearchCostPage model) { ... }
или вы можете использовать
ActionName
атрибут как псевдонимpublic ActionResult Submit(SearchCostPage model) { ... } [ActionName("SubmitExcel")] public ActionResult Submit(SearchCostPage model) { ... }
вы можете использовать ajax-вызовы для вызова различных методов без обратной передачи
$.ajax({ type: "POST", url: "@(Url.Action("Action", "Controller"))", data: {id: 'id', id1: 'id1' }, contentType: "application/json; charset=utf-8", cache: false, async: true, success: function (result) { //do something } });