Форме отправки сообщения для разных почтовых действие 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 } });