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

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

17 ответов


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


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


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

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

Бритва Код

@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);
}

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

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

вот ответ, запеченный по умолчанию 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>
}

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


используйте следующую ссылку вызова действия:

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

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

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

он отправит данные в действие Customer Controller и CustomerSearchResults.


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

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

;)


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

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

return View("Index", model); 

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


Это была трудная задача для меня, чтобы решить. Как создать динамическую ссылку в razor и 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.Действие не имеет значения, является ли метод действия GET или a ДОЛЖНОСТЬ. Он будет иметь доступ к любому типу метода. Вы можете передать свои данные в метод action, используя

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

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


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

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), который вызывается, когда ссылка генерируется с - это;

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

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

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

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

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

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

Метод Запроса: POST код статуса: 302 найдено

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

Адрес:/Обратная Связь Хост:localhost: 38874 Данные Формы X-HTTP-метод-переопределение: удалить id: 5

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


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


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


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

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

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

следующее решение, которое работает для меня.

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

устранение:

In .cshtml по:

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

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

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

postGo определяется как показано ниже в JavaScript. Остальное просто..

@URL-адрес.Действие ("Вид") создает 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

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

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


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

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


наткнулся на эту необходимость публикации со страницы поиска (индекса) на страницу результатов. Мне не нужно было столько, сколько сказал @Vitaliy, но он указал мне в правильном направлении. Все, что мне нужно было сделать, это:--3-->

@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)