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

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

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

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

Ответы [ 17 ]

1 голос
/ 06 августа 2011

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

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

;)

1 голос
/ 19 декабря 2011

Это было трудной проблемой для меня, чтобы решить. Как создать динамическую ссылку в бритве и 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 ​​содержит ваши данные, не имеет значения, является ли это публикацией или получением. Вы можете использовать определенную сигнатуру метода действия, чтобы выбрать правильный метод.

0 голосов
/ 08 февраля 2017

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

@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)
0 голосов
/ 29 июля 2015

Вызов $ .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': @ receive.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/

0 голосов
/ 31 июля 2011

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

0 голосов
/ 05 июня 2019

Это взято из примера проекта 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>
            }
        }
0 голосов
/ 12 января 2010

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

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

...