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

        }
   }

вопросы

  1. есть ли способ направить на различные методы действия POST при разных щелчках кнопки (без пользовательской маршрутизации)?
  2. если нет никакого способа без пользовательской маршрутизации, как мы можем это сделать с пользовательской маршрутизации?

ссылки:

  1. Джимми Богард-очистка сообщений в ASP.NET MVC
4 51

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 упомянутые в

  1. как вы обрабатываете несколько кнопок отправки в ASP.NET MVC Framework?

  2. ASP.Net MVC 4 форма с 2 отправить кнопки/действия

http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx

ответ 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
     }
});