Вопрос

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

Это было полезно?

Решение

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

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

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

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

;)

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

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

return View("Index", model); 

что такое почтовый метод

Мне было трудно решить эту проблему.Как я могу создать динамическую ссылку в 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.Action не имеет значения, является ли метод action GET или POST.Он получит доступ к любому типу метода.Вы можете передать свои данные методу action, используя

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

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

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

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

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

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>

Достопримечательности в Рэйзор Вью:

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

  2. confirmDelete() функции требуется идентификатор элемента, на который нажимают.Этот элемент передан из onClick обработчик confirmDelete("+feedback.Id+");return false; Обратите внимание, что обработчик возвращает false, чтобы предотвратить действие по умолчанию — получение запроса к цели. 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 найден

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

Местоположение:/Hestback Host: Localhost: 38874Данные формы X-HTTP-Method-Override:DELETE идентификатор:5

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

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

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

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

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

Решение:

В файле .cshtml:

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

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

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

Отправление определяется в JavaScript следующим образом.Остальные просты..

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

{ 'идентификатор':@квитанция.Идентификатор квитанции } создает параметры как объект, который, в свою очередь, преобразуется в поля 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 с использованием jQuery (плагина?)

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

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

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

Столкнулся с необходимостью 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)

Это взято из примера проекта 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>
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top