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


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

17 91

17 ответов:

вы не можете использовать ActionLink потому что это просто делает якорь <a> тег.
Вы можете использовать jQuery AJAX post.
Или просто вызовите метод submit формы с или без 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 никогда не будет стрелять пост. Это всегда триггер получить запрос.

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

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

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

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

он отправит данные в контроллер клиента и действие 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 и передает идентификатор

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 ДОЛЖНОСТЬ. Он будет иметь доступ к любому типу метода. Вы можете передать свои данные в метод действия с помощью

@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 возвращает 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

Метод Запроса: сообщение код состояния:302 найдено

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

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

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

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

Я бы рекомендовал оставаться чистым для принципов отдыха и использовать 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, в котором вызывается метод с 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, которые я использовал для постго

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

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

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

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

наткнулся на эту необходимость опубликовать со страницы поиска (индекса) на страницу результатов. Мне не нужно было столько, сколько @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)