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

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

Ответ 1

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

Ответ 2

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

Ответ 3

Вы можете использовать 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();
        });
    });

С#

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

    return RedirectToAction("Index");
    //return View(model);
}

Ответ 4

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

@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })

Ответ 5

Вот был ответ, задуманный в проект 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>
}

Ответ 6

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

Ответ 7

Используйте ссылку "Вызвать действие":

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

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

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

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

Ответ 8

Используйте эту ссылку внутри Ajax.BeginForm

@Html.ActionLink(
    "Save", 
    "SaveAction", 
    null, 
    null, 
    onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })

;)

Ответ 9

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

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

return View("Index", model); 

который является методом post

Ответ 10

Это была трудная проблема для меня. Как создать динамическую ссылку в бритве и html, которая может вызвать метод действия и передать значение или значения конкретному методу действий? Я рассмотрел несколько вариантов, включая пользовательский html-помощник. Я просто придумал простое и элегантное решение.

Вид

@model IEnumerable<MyMvcApp.Models.Product>

@using (Html.BeginForm()) {

     <table>
         <thead>
             <tr>
                 <td>Name</td>
                 <td>Price</td>
                 <td>Quantity</td>
            </tr>
        </thead>
        @foreach (Product p in Model.Products)
        {
            <tr>
                <td><a href="@Url.Action("Edit", "Product", p)">@p.Name</a></td>
                <td>@p.Price.ToString()</td>
                <td>@p.Quantity.ToString()</td>
            </tr>
         }
    </table>
}

Метод действия

public ViewResult Edit(Product prod)
{
    ContextDB contextDB = new ContextDB();

    Product product = contextDB.Products.Single(p => p.ProductID == prod.ProductId);

    product = prod;

    contextDB.SaveChanges();

    return View("Edit");
}

Дело здесь в том, что Url.Action не волнует, является ли метод действий GET или POST. Он получит доступ к любому типу метода. Вы можете передать свои данные методу действия с помощью

@Url.Action(string actionName, string controllerName, object routeValues)

объект routeValues. Я пробовал это, и он работает. Нет, вы не занимаетесь техническим заданием или не отправляете форму, но если объект routeValues ​​содержит ваши данные, это не имеет значения, если это сообщение или получение. Вы можете использовать конкретную подпись метода действий, чтобы выбрать правильный метод.

Ответ 11

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

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}

Ответ 12

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

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:

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

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

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

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

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

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

URL-адрес запроса: http://localhost:38874/Feedback/Delete

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

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

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

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

Ответ 13

Для отправки POST вам необходимо отправить данные формы. Я не думаю, что это возможно сделать с помощью ActionLink. Проверьте эту ссылку.

Ответ 14

jQuery.post() будет работать, если у вас есть пользовательские данные. Если вы хотите опубликовать существующую форму, проще использовать ajaxSubmit().

И вам не нужно настраивать этот код в самом ActionLink, так как вы можете присоединить обработчик ссылок в событии document.ready() (что в любом случае является предпочтительным методом), например, используя трюк $(function(){ ... }) jQuery.

Ответ 15

Я бы рекомендовал оставаться чистым для принципов REST и использовать удаление HTTP для ваших удалений. К сожалению, спецификации HTML имеют только HTTP Get и Post. Тег может только HTTP Get. Тег формы может выполнять HTTP Get или Post. К счастью, если вы используете ajax, вы можете сделать HTTP Delete, и это то, что я рекомендую. Подробнее см. В следующем сообщении: Http Deletes

Ответ 16

Вызов $.post() не будет работать, поскольку он основан на Ajax. Поэтому для этой цели необходимо использовать гибридный метод.

Ниже приводится решение, которое работает для меня.

Шаги: 1. Создайте URL-адрес для href, который вызывает метод с url и параметром 2. Вызвать обычный POST с использованием JavaScript-метода.

Решение:

В .cshtml:

<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId  } );})()">View</a>

Примечание: анонимный метод должен быть завернут в (....)() т.е.

(function() {
    //code...
})();

postGo определяется как указано в JavaScript. Отдых прост.

@Url.Action( "Просмотр" ) создает URL для вызова

{'id': @receipt.ReceiptId} создает параметры как объект, который в свою очередь преобразуется в поля POST в методе postGo. Это может быть любой параметр, который вам нужен

В JavaScript:

(function ($) {
    $.extend({
        getGo: function (url, params) {
            document.location = url + '?' + $.param(params);
        },
        postGo: function (url, params) {
            var $form = $("<form>")
                .attr("method", "post")
                .attr("action", url);
            $.each(params, function (name, value) {
                $("<input type='hidden'>")
                    .attr("name", name)
                    .attr("value", value)
                    .appendTo($form);
            });
            $form.appendTo("body");
            $form.submit();
        }
    });
})(jQuery);

Справочные URL-адреса, которые я использовал для postGo

Не-ajax GET/POST с помощью jQuery (плагин?)

http://nuonical.com/jquery-postgo-plugin/

Ответ 17

Переместился через это, требуя POST с страницы поиска (указателя) на страницу результатов. Мне не нужно столько, сколько сказал Виталий, но он указал мне в правильном направлении. Все, что я должен был сделать, это следующее:

@using (Html.BeginForm("Result", "Search", FormMethod.Post)) {
  <div class="row">
    <div class="col-md-4">
      <div class="field">Search Term:</div>
      <input id="k" name="k" type="text" placeholder="Search" />
    </div>
  </div>
  <br />
  <div class="row">
    <div class="col-md-12">
      <button type="submit" class="btn btn-default">Search</button>
    </div>
  </div>
}

Мой контроллер имел следующий метод подписи:

[HttpPost]
public async Task<ActionResult> Result(string k)

Ответ 18

Это взято из примера проекта MVC

@if (ViewBag.ShowRemoveButton)
      {
         using (Html.BeginForm("RemoveLogin", "Manage"))
           {
              @Html.AntiForgeryToken()
                  <div>
                     @Html.Hidden("company_name", account)
                     @Html.Hidden("returnUrl", Model.returnUrl)
                     <input type="submit" class="btn btn-default" value="Remove" title="Remove your email address from @account" />
                  </div>
            }
        }