ASP.NET MVC ActionLink и метод post - PullRequest
       106

ASP.NET MVC ActionLink и метод post

95 голосов
/ 12 января 2010

Может кто-нибудь сказать мне, как я могу передать значения в контроллер, используя ActionLink и метод POST?
Я не хочу использовать кнопки.
Я думаю, что-то с jquery.

Ответы [ 17 ]

71 голосов
/ 31 мая 2011

Если вы используете ASP MVC3, вы можете использовать Ajax.ActionLink (), который позволяет вам указать метод HTTP, который вы можете установить на «POST».

55 голосов
/ 12 января 2010

Вы не можете использовать ActionLink, потому что это просто отображает тег <a> привязки.
Вы можете использовать jQuery AJAX post .
Или просто вызовите метод отправки формы с или без jQuery (который не является AJAX), возможно, в случае onclick любого элемента управления, который вам захочется.

20 голосов
/ 24 января 2012

Вы можете использовать jQuery, чтобы сделать POST для всех ваших кнопок. Просто дайте им то же имя CssClass.

Используйте "return false;" в конце события onclick javascript, если вы хотите выполнить RedirectToAction на стороне сервера после публикации, в противном случае просто верните представление.

Код бритвы

@using (Html.BeginForm())
{
    @Html.HiddenFor(model => model.ID) 
    @Html.ActionLink("Save", "SaveAction", "MainController", null, new { @class = "saveButton", onclick = "return false;" })
}

Код JQuery

$(document).ready(function () {
        $('.saveButton').click(function () {
            $(this).closest('form')[0].submit();
        });
    });

C #

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
    // Save code here...

    return RedirectToAction("Index");
    //return View(model);
}
14 голосов
/ 11 декабря 2012

@ У Айдоса был правильный ответ, он просто хотел прояснить его, поскольку он скрыт внутри комментария к его сообщению, сделанного @ CodingWithSpike.

@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
5 голосов
/ 02 августа 2017

Вот ответ, который был добавлен в проект ASP.NET MVC 5 по умолчанию, который, как мне кажется, хорошо выполняет мои задачи по стилю в пользовательском интерфейсе. Отправка формы с использованием чистого javascript для какой-либо содержащей формы.

@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
   <a href="javascript:document.getElementById('logoutForm').submit()">
      <span>Sign out</span>
   </a>
}

Полностью показанный вариант использования - это раскрывающийся список выхода из системы на панели навигации веб-приложения.

@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
{
    @Html.AntiForgeryToken()

    <div class="dropdown">
        <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
            <span class="ma-nav-text ma-account-name">@User.Identity.Name</span>
            <i class="material-icons md-36 text-inverse">person</i>
        </button>

        <ul class="dropdown-menu dropdown-menu-right ma-dropdown-tray">
            <li>
                <a href="javascript:document.getElementById('logoutForm').submit()">
                    <i class="material-icons">system_update_alt</i>
                    <span>Sign out</span>
                </a>
            </li>
        </ul>
    </div>
}
3 голосов
/ 17 мая 2011

ActionLink никогда не будет запускать пост. Он всегда вызывает запрос GET.

2 голосов
/ 10 марта 2011

Используйте следующую ссылку «Вызовите действие»:

<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>

Для отправки значений формы используйте:

 <% using (Html.BeginForm("CustomerSearchResults", "Customer"))
   { %>
      <input type="text" id="Name" />
      <input type="submit" class="dASButton" value="Submit" />
   <% } %>

Он отправит данные в контроллер клиента и действие CustomerSearchResults.

1 голос
/ 30 июля 2015

Это моё решение проблемы. Это контроллер с двумя методами действия

public class FeedbackController : Controller
{
public ActionResult Index()
{
   var feedbacks =dataFromSomeSource.getData;
   return View(feedbacks);
}

[System.Web.Mvc.HttpDelete]
[System.Web.Mvc.Authorize(Roles = "admin")]
public ActionResult Delete([FromBody]int id)
{
   return RedirectToAction("Index");
}
}

В представлении я отображаю следующую структуру.

<html>
..
<script src="~/Scripts/bootbox.min.js"></script>
<script>
function confirmDelete(id) {
  bootbox.confirm('@Resources.Resource.AreYouSure', function(result) {
    if (result) {
      document.getElementById('idField').value = id;
      document.getElementById('myForm').submit();
    }
  }.bind(this));
}
</script>

@using (Html.BeginForm("Delete", "Feedback", FormMethod.Post, new { id = "myForm" }))
{
  @Html.HttpMethodOverride(HttpVerbs.Delete)
  @Html.Hidden("id",null,new{id="idField"})
  foreach (var feedback in @Model)
  {
   if (User.Identity.IsAuthenticated && User.IsInRole("admin"))
   {
    @Html.ActionLink("Delete Item", "", new { id = @feedback.Id }, new { onClick = "confirmDelete("+feedback.Id+");return false;" })
   }
  }
...
</html>

Достопримечательности в Razor View :

  1. функция JavaScript confirmDelete(id), которая вызывается при нажатии на ссылку, созданную с помощью @Html.ActionLink;

  2. confirmDelete() функция требуется идентификатор элемента, по которому щелкают. Этот элемент передается из onClick handler confirmDelete("+feedback.Id+");return false; Обратите внимание, что обработчик возвращает false, чтобы предотвратить действие по умолчанию, то есть запрос get для цели. OnClick событие для кнопок может быть присоединено с помощью jQuery для всех кнопок в списке в качестве альтернативы (возможно, это будет еще лучше, поскольку на HTML-странице будет меньше текста и данные можно будет передавать через атрибут data-).

  3. Форма имеет id=myForm, чтобы найти ее в confirmDelete().

  4. Форма включает @Html.HttpMethodOverride(HttpVerbs.Delete) для использования глагола HttpDelete в качестве действия, помеченного HttpDeleteAttribute.

  5. В функции JS я использую подтверждение действия (с помощью внешнего плагина, но стандартное подтверждение тоже отлично работает. Не забудьте использовать bind() при обратном вызове или var that=this (что вы предпочитаете) .

  6. Форма имеет скрытый элемент с id='idField' и name='id'. Таким образом, перед отправкой формы после подтверждения (result==true), значение скрытого элемента устанавливается равным значению переданного аргумента, и браузер отправляет данные в контроллер следующим образом:

Запрос URL : http://localhost:38874/Feedback/Delete

Способ запроса : Код состояния POST: 302 Найдено

Заголовки ответа

Расположение: / Обратная связь Ведущий: локальный: 38874 Данные формы X-HTTP-метод-переопределение: УДАЛИТЬ id: 5

Как вы видите, это POST-запрос с X-HTTP-Method-Override: DELETE и данными в теле, установленными в "id: 5". Ответ содержит код 302, который перенаправляет на действие «Индекс», тем самым вы обновляете свой экран после удаления.

1 голос
/ 20 ноября 2014

Я сделал ту же проблему, используя следующий код:

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}
1 голос
/ 21 октября 2011

Мое решение этой проблемы довольно простое. У меня есть страница, которая выполняет поиск клиентов по всей электронной почте, а другая - по частичной, частичной - выводит и отображает список, в списке есть ссылка действия, которая указывает на результат действия с именем GetByID и передает идентификатор

GetByID извлекает данные для выбранного клиента, затем возвращает

return View("Index", model); 

который является методом сообщения

...