有谁能告诉我如何使用ActionLink和POST方法向Controller提交值?
我不想使用按钮
我想它与jquery有关。
答案 0 :(得分:70)
如果你正在使用ASP MVC3,你可以使用Ajax.ActionLink(),它允许你指定一个你可以设置为“POST”的HTTP方法。
答案 1 :(得分:54)
您无法使用ActionLink
,因为它只会呈现锚<a>
标记
您可以使用jQuery AJAX post
或者只是在有或没有jQuery(非AJAX)的情况下调用表单的提交方法,也许在onclick
事件中,无论你喜欢什么控件。
答案 2 :(得分:20)
您可以使用jQuery为所有按钮执行POST。只需给它们相同的CssClass名称。
使用“return false;”在你的onclick javascript事件结束时如果你想在post之后做一个服务器端RedirectToAction,否则只返回视图。
Razor Code
@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);
}
答案 3 :(得分:14)
@Aidos有正确的答案,只是想说清楚,因为它隐藏在@CodingWithSpike发表的帖子的评论中。
@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })
答案 4 :(得分:5)
这是一个在默认的ASP.NET MVC 5项目中得到的答案,我相信它可以在UI中很好地完成我的样式目标。表单使用纯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>
}
完全显示的用例是Web应用程序导航栏中的注销下拉列表。
@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>
}
答案 5 :(得分:3)
ActionLink绝不会发帖。它总是触发GET请求。
答案 6 :(得分:2)
使用以下“呼叫行动链接:
”<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>
要提交表单值,请使用:
<% using (Html.BeginForm("CustomerSearchResults", "Customer"))
{ %>
<input type="text" id="Name" />
<input type="submit" class="dASButton" value="Submit" />
<% } %>
它将向客户控制器和CustomerSearchResults Action提交数据。
答案 7 :(得分:1)
这对我来说是一个难以解决的问题。如何在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不关心动作方法是GET还是POST。它将访问任何一种方法。您可以使用
将数据传递给操作方法@Url.Action(string actionName, string controllerName, object routeValues)
routeValues对象。我试过这个并且它有效。不,您在技术上不是在发帖或提交表单,但如果routeValues对象包含您的数据,那么无论是帖子还是获取都无关紧要。您可以使用特定的操作方法签名来选择正确的方法。
答案 8 :(得分: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中的兴趣点:
单击confirmDelete(id)
生成的链接时调用的JavaScript函数@Html.ActionLink
;
confirmDelete()
功能需要点击项目的ID。此项目从onClick
处理程序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
)之后提交表单之前,隐藏元素的值设置为值传递参数,浏览器将向控制器提交数据,如下所示:
请求网址:http://localhost:38874/Feedback/Delete
请求方法:POST状态代码:302 Found
响应标头
位置:/反馈 主持人:本地主机:38874 表单数据 X-HTTP-Method-Override:DELETE id:5
如您所见,它是带有X-HTTP-Method-Override的POST请求:DELETE,并且正文中的数据设置为“id:5”。响应有302个代码重定向到索引操作,这样您在删除后刷新屏幕。
答案 9 :(得分:1)
我对此问题的解决方案非常简单。我有一个页面,客户通过整个电子邮件搜索一个,另一个通过部分,部分拉动并显示列表,列表有一个动作链接,指向名为GetByID的动作结果并传入id
GetByID为所选客户提取数据,然后返回
return View("Index", model);
这是post方法
答案 10 :(得分:1)
在Ajax.BeginForm
中使用此链接@Html.ActionLink(
"Save",
"SaveAction",
null,
null,
onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })
)
答案 11 :(得分:0)
jQuery.post()
将有效。如果您要发布现有表单,则可以更轻松地使用ajaxSubmit()
。
并且您不必在ActionLink
本身中设置此代码,因为您可以在document.ready()
事件中附加链接处理程序(无论如何这是一种首选方法),例如使用{{ 1}} jQuery技巧。
答案 12 :(得分:0)
我使用以下代码完成了同样的问题:
@using (Html.BeginForm("Delete", "Admin"))
{
@Html.Hidden("ProductID", item.ProductID)
<input type="submit" value="Delete" />
}
答案 13 :(得分:0)
调用$ .post()将无法正常工作,因为它是基于Ajax的。因此,需要使用混合方法来实现此目的。
以下是适合我的解决方案。
步骤: 1.为href创建URL,该URL使用url和parameter调用方法 2.使用JavaScript方法调用普通POST
解决方案:
在.cshtml中:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
注意:匿名方法应该包含在(....)()中 即
(function() {
//code...
})();
postGo 在JavaScript中定义如下。 休息很简单..
@ Url.Action(“查看”)为通话创建网址
{'id':@ receipt.ReceiptId} 创建参数作为对象,然后在postGo方法中转换为POST字段。这可以是您需要的任何参数
在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);
我用于postGo的参考网址
答案 14 :(得分:0)
遇到这种情况需要从搜索(索引)页面发送到结果页面。我不需要像@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)
答案 15 :(得分:0)
我建议保持纯粹的REST原则并对删除使用HTTP删除。不幸的是HTML规范只有HTTP Get&amp;帖子。标签只能是HTTP Get。表单标记可以执行HTTP Get或Post。幸运的是,如果您使用ajax,您可以执行HTTP删除,这是我推荐的。有关详细信息,请参阅以下帖子:Http Deletes
答案 16 :(得分:0)
这取自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>
}
}