2010-01-12 2 views
87

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

+0

Я написал метод, похожий на Html.ActionLink, только он строит POST-форму с кнопкой «Отправить». Я посмотрю, могу ли я дать возможность заменить кнопку ссылкой, которая отправляет форму. См. Здесь: http://stackoverflow.com/questions/3449807/mvc-make-action-link-perform-a-submit/29155696#29155696 – kape123

ответ

47

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

0

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

0

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

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

2

Используйте следующую Зов Акция Link:

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

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

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

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

3

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

64

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

+41

Обратите внимание, что для выполнения этой работы вам нужно будет включить один из javascript ajax файлы, например "jquery.unobtrusive-ajax.min.js'". В противном случае он будет продолжать делать GET вместо POST при нажатии. Синтаксис, чтобы ссылка была такой: '@ Ajax.ActionLink (« Удалить »,« Удалить », новый {id = item.Id}, новый AjaxOptions {HttpMethod =" POST "})' – CodingWithSpike

+1

ненавязчивый ajax отлично работал, но я пришлось использовать ссылку на действие немного иначе, передав параметр «Словарь как параметр» вместо этого объекта AjaxOptions: http://stackoverflow.com/a/10657891/429521 Кроме того, мне пришлось передать атрибуты ajax вручную, чтобы JS мог catch и переопределять события кликов, они были «data-ajax» = «true», «data-ajax-url» = и «data-ajax-method» = «Post» '. Btw, я использую ASP.NET MVC 3 –

+0

@FelipeSabino, ссылка, которую вы предоставили, теперь сломана. – CokoBWare

0

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

1

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

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

;)

1

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

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

return View("Index", model); 

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

1

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

+1

Я попробовал ваш образец, и браузер отправляет GET на сервер, даже форма имеет тип Post. Если actionMethod в контроллере имеет атрибут [HttpPost], запрос не выполняется, поскольку маршрут не найден. –

20

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

C#

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

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

Я думал, что он ясно дал понять, что не хочет использовать кнопки? – goodies4uall

+0

@ goodies4uall Действительно, и этот ответ делает именно это.:) Класс CSS называется «saveButton» (возможно, вводящее в заблуждение имя), но для запуска действия используется тег привязки – Savantes

13

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

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

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

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

Если у вас много элементов на странице, вам нужно будет обернуть каждую из них в форму и как результатом будет сформировано много форм. Также отображает кнопку, а не ссылку. –

+0

@VitaliyMarkitanov Вы предлагаете использовать jQuery ajax? – isxaker

+0

Посмотрите на мое сообщение ниже в этой теме, я объяснил свое решение там. –

0

Calling $ .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 ("View") создает 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); 

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

Non-ajax GET/POST using jQuery (plugin?)

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

1

Это мое решение для проблема. Это контроллер с 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), который вызывается, когда связь создается с @Html.ActionLink щелкают;

  2. confirmDelete() функция требуется идентификатор предмета щелкнув. Этот элемент передается от onClick handler 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 Найдено

Response Headers

Расположение:/Обратная связь Ведущий: локальный: 38874 Form Data X-HTTP-Method-Override: DELETE ID: 5

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

0

Поступил через этот запрос на 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) 
3

Здесь был ответ запеченный в 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> 
} 
Смежные вопросы