Может ли кто-нибудь сказать мне, как я могу передать значения контроллеру с помощью ActionLink и метода POST?
Я не хочу использовать кнопки.
Я думаю, у него есть что-то с jquery.
ASP.NET MVC ActionLink и метод post
Ответ 1
Вы не можете использовать ActionLink
потому что это просто отображает якорный тег <a>
.
Вы можете использовать пост jQuery AJAX.
Или просто вызовите метод отправки формы с помощью jQuery или без него (это будет не AJAX), возможно, в событии onclick
какого-либо элемента управления требуется ваше воображение.
Ответ 2
Если вы используете ASP MVC3, вы можете использовать Ajax.ActionLink(), который позволяет вам указать HTTP-метод, который вы можете установить на "POST".
Ответ 3
Вы можете использовать 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();
});
});
С#
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SaveAction(SaveViewModel model)
{
// Save code here...
return RedirectToAction("Index");
//return View(model);
}
Ответ 4
@Aidos имел правильный ответ, просто хотел прояснить его, поскольку он скрыт в комментарии к его сообщению, сделанному @CodingWithSpike.
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
Ответ 5
Вот был ответ, задуманный в проект 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>
}
Ответ 6
ActionLink никогда не будет запускать сообщение. Он всегда вызывает запрос GET.
Ответ 7
Используйте ссылку "Вызвать действие":
<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>
Для отправки значений формы используйте:
<% using (Html.BeginForm("CustomerSearchResults", "Customer"))
{ %>
<input type="text" id="Name" />
<input type="submit" class="dASButton" value="Submit" />
<% } %>
Он отправит данные в клиентский контроллер и действие CustomerSearchResults.
Ответ 8
Используйте эту ссылку внутри Ajax.BeginForm
@Html.ActionLink(
"Save",
"SaveAction",
null,
null,
onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })
;)
Ответ 9
Мое решение этой проблемы довольно простое. У меня есть страница, которая выполняет поиск клиента по всей электронной почте, а другая частичным, частичным вытягивает и отображает список. В списке есть ссылка действия, которая указывает на actionresult с именем GetByID и передает в id
GetByID извлекает данные для выбранного клиента, а затем возвращает
return View("Index", model);
который является методом post
Ответ 10
Это была трудная проблема для меня. Как создать динамическую ссылку в бритве и 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 содержит ваши данные, это не имеет значения, если это сообщение или получение. Вы можете использовать конкретную подпись метода действий, чтобы выбрать правильный метод.
Ответ 11
Я сделал ту же проблему, используя следующий код:
@using (Html.BeginForm("Delete", "Admin"))
{
@Html.Hidden("ProductID", item.ProductID)
<input type="submit" value="Delete" />
}
Ответ 12
Это мое решение проблемы. Это контроллер с двумя методами действий
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:
-
Функция JavaScript
confirmDelete(id)
, вызываемая при нажатии ссылки, сгенерированной с помощью@Html.ActionLink
; -
confirmDelete()
Функция требует идентификатора элемента, который нажата. Этот элемент передается изonClick
handlerconfirmDelete("+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
) значение скрытого элемента устанавливается в значение переданного аргумента, и браузер передает данные в контроллер следующим образом:
URL-адрес запроса: http://localhost:38874/Feedback/Delete
Метод запроса: POST Код состояния: 302 Найдено
Заголовки ответов
Расположение:/Обратная связь Ведущий: локальный: 38874 Данные формы X-HTTP-метод-переопределение: DELETE id: 5
Как вы видите, это POST-запрос с X-HTTP-методом-Override: DELETE и данные в теле, установленном на "id: 5". В ответе есть код 302, который перенаправляет действие индекса, тем самым вы обновляете свой экран после удаления.
Ответ 13
Для отправки POST вам необходимо отправить данные формы. Я не думаю, что это возможно сделать с помощью ActionLink. Проверьте эту ссылку.
Ответ 14
jQuery.post()
будет работать, если у вас есть пользовательские данные. Если вы хотите опубликовать существующую форму, проще использовать ajaxSubmit()
.
И вам не нужно настраивать этот код в самом ActionLink
, так как вы можете присоединить обработчик ссылок в событии document.ready()
(что в любом случае является предпочтительным методом), например, используя трюк $(function(){ ... })
jQuery.
Ответ 15
Я бы рекомендовал оставаться чистым для принципов REST и использовать удаление HTTP для ваших удалений. К сожалению, спецификации HTML имеют только HTTP Get и Post. Тег может только HTTP Get. Тег формы может выполнять HTTP Get или Post. К счастью, если вы используете ajax, вы можете сделать HTTP Delete, и это то, что я рекомендую. Подробнее см. В следующем сообщении: Http Deletes
Ответ 16
Вызов $.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': @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-адреса, которые я использовал для postGo
Ответ 17
Переместился через это, требуя 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)
Ответ 18
Это взято из примера проекта 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>
}
}