ASP.NET MVC ActionLink и метод post
Может ли кто-нибудь сказать мне, как я могу представить значения Контроллеру, используя ActionLink и метод POST?
Я не хочу использовать кнопки.
Я думаю, у него есть что-то с jquery.
- Поддержка optgroup в выпадающем списке .NET MVC?
- Подделка формы с C # WebClient
- Лучшие рекомендации по ViewModel
- Кто-нибудь реализует RadioButtonListFor для ASP.NET MVC?
- Ajax.BeginForm в MVC для загрузки файлов
- jQuery Ajax вызывает и Html.AntiForgeryToken ()
- Использование MySql с Entity Framework 4 и Code-First Development CTP
- Настройка авторизации в ASP.NET MVC
Вы не можете использовать ActionLink
потому что это просто отображает якорный тег .
Вы можете использовать пост jQuery AJAX .
Или просто вызовите метод отправки формы с помощью jQuery или без него (что было бы не AJAX), возможно, в событии onclick
какого-либо элемента управления требуется ваше воображение.
Если вы используете ASP MVC3, вы можете использовать Ajax.ActionLink (), который позволяет указать HTTP-метод, который вы можете установить на «POST».
Вы можете использовать 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); }
@Aidos имел правильный ответ, просто хотел прояснить его, поскольку он скрыт внутри комментария на его пост, сделанный @CodingWithSpike.
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
ActionLink никогда не будет запускать почту. Он всегда вызывает запрос GET.
Здесь был ответ, испеченный в проект ASP.NET MVC по умолчанию, который, как мне кажется, хорошо меняет мои стилистические цели в пользовательском интерфейсе. Форма передается с использованием чистого javascript в некоторую содержащую форму.
@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) { Sign out }
Полностью показанный вариант использования – это выпадающее меню выхода на панели навигации веб-приложения.
@using (Html.BeginForm("Logout", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) { @Html.AntiForgeryToken() }
Используйте ссылку «Вызовите действие»:
<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>
Для представления значений формы используйте:
<% using (Html.BeginForm("CustomerSearchResults", "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 и передает идентификатор
GetByID извлекает данные для выбранного клиента, а затем возвращает
return View("Index", model);
который является почтовым методом
Это была трудная проблема для меня. Как создать динамическую ссылку в бритве и html, которая может вызвать метод действия и передать значение или значения конкретному методу действий? Я рассмотрел несколько вариантов, включая пользовательский html-помощник. Я просто придумал простое и элегантное решение.
Вид
@model IEnumerable @using (Html.BeginForm()) { Name Price Quantity @foreach (Product p in Model.Products) { @p.Name @p.Price.ToString() @p.Quantity.ToString() }
}
Метод действия
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. Он получит доступ к любому типу метода. Вы можете передать свои данные методу действия, используя
https://stackoverflow.com/questions/2048778/asp-net-mvc-actionlink-and-post-method/@Url.Action(string actionName, string controllerName, object routeValues)
объект routeValues. Я пробовал это, и он работает. Нет, вы не занимаетесь техническим заданием или не отправляете форму, но если объект routeValues содержит ваши данные, это не имеет значения, если это сообщение или получение. Вы можете использовать конкретную подпись метода действия, чтобы выбрать правильный метод.
Это мое решение проблемы. Это controller с двумя методами действий
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"); } }
В представлении я создаю конструкцию следующей структуры.
.. @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;" }) } } ...
Точка зрения в Razor Вид :
-
Функция JavaScript
confirmDelete(id)
вызываемая при нажатии ссылки, сгенерированной с помощью@Html.ActionLink
; -
confirmDelete()
требуется, чтобы идентификатор элемента был нажат. Этот элемент передается из обработчикаconfirmDelete("+feedback.Id+");return false;
Обратите внимание, обработчик возвращает false, чтобы предотвратить действие по умолчанию – это запрос на получение цели. СобытиеOnClick
для кнопок может быть подключено с помощью jQuery для всех кнопок в списке в качестве альтернативы (возможно, это будет еще лучше, так как это будет меньше текста на странице HTML, и данные могут быть переданы через атрибут data). -
Форма имеет
id=myForm
, чтобы найти ее вconfirmDelete()
. -
Форма включает
@Html.HttpMethodOverride(HttpVerbs.Delete)
, чтобы использовать глаголHttpDelete
, как действие, помеченноеHttpDeleteAttribute
. -
В JS-функции я использую подтверждение действия (с помощью внешнего плагина, но стандартное подтверждение также отлично работает. Не забудьте использовать
bind()
в обратном вызове илиvar that=this
(независимо от того, что вы предпочитаете). -
Форма имеет скрытый элемент с
id='idField'
иname='id'
. Поэтому перед отправкой формы после подтверждения (result==true
) значение скрытого элемента устанавливается равным значению переданного аргумента, и браузер передает данные в controller следующим образом:
URL-адрес запроса : http://localhost:38874/Feedback/Delete
Метод запроса : POST Код состояния: 302 Найдено
Заголовки ответов
Расположение: / Обратная связь Хост: localhost: 38874 Данные формы X-HTTP-метод-переопределение: DELETE id: 5
Как вы видите, это запрос POST с помощью метода X-HTTP-Method-Override: DELETE и данные в теле, установленном на «id: 5». В ответе есть код 302, который перенаправляет действие индекса, тем самым вы обновляете свой экран после удаления.
Для отправки POST вам необходимо отправить данные формы. Я не думаю, что это возможно сделать с помощью ActionLink. Проверьте эту ссылку .
Я бы рекомендовал оставаться чистым для принципов REST и использовать HTTP-удаление для ваших удалений. К сожалению, спецификации HTML имеют только HTTP Get & Post. Тег может только HTTP Get. Тег формы может выполнять HTTP Get или Post. К счастью, если вы используете ajax, вы можете сделать HTTP Delete, и это то, что я рекомендую. Более подробную информацию см. В следующем сообщении: Http Deletes
Я сделал ту же проблему, используя следующий код:
@using (Html.BeginForm("Delete", "Admin")) { @Html.Hidden("ProductID", item.ProductID) }
Вызов $ .post () не будет работать, поскольку он основан на Ajax. Поэтому для этой цели необходимо использовать гибридный метод.
Следующее – это решение, которое работает для меня.
Шаги: 1. Создайте URL-адрес для href, который вызывает метод с url и параметром 2. Позвоните обычным POST с использованием метода JavaScript
Решение:
В .cshtml:
View
Примечание: анонимный метод должен быть завернут в (….) () т.е.
(function() { //code... })();
postGo определяется как указано в JavaScript. Отдых прост ..
@ Url.Action («Вид») создает URL-адрес для вызова
{‘id’: @ receipt.ReceiptId} создает параметры как объект, который в свою очередь преобразуется в поля POST в методе postGo. Это может быть любой параметр по мере необходимости
В JavaScript:
(function ($) { $.extend({ getGo: function (url, params) { document.location = url + '?' + $.param(params); }, postGo: function (url, params) { var $form = $("
URL ссылок, которые я использовал для postGo
Не-ajax GET / POST с использованием jQuery (плагин?)
jQuery.post()
будет работать, если у вас есть пользовательские данные. Если вы хотите опубликовать существующую форму, проще использовать ajaxSubmit()
.
И вам не нужно настраивать этот код в самой ActionLink
, так как вы можете присоединить обработчик ссылок в событии document.ready()
(что в любом случае является предпочтительным методом), например, используя $(function(){ ... })
трюк jQuery.
Для этого понадобилось POST с страницы поиска (указателя) на страницу результатов. Мне не нужно столько, сколько сказал Виталий, но он указал мне в правильном направлении. Все, что я должен был сделать, это:
@using (Html.BeginForm("Result", "Search", FormMethod.Post)) { Search Term:
}
Мой controller имел следующий метод подписи:
[HttpPost] public async Task Result(string k)