ASP.NET MVC ActionLink和post方法
任何人都可以告诉我如何使用ActionLink和POST方法提交值给控制器?
我不想使用button。
我想这与jQuery的东西。
您不能使用ActionLink
因为它只是呈现一个锚点<a>
标记。
你可以使用一个jQuery的AJAXpost 。
或者只是调用带有或不带有jQuery的表单的提交方法(这可能是非AJAX),也许在任何控制的onclick
事件中,
如果您使用的是ASP MVC3,您可以使用Ajax.ActionLink(),它允许您指定一个可以设置为“POST”的HTTP方法。
您可以使用jQuery为所有button执行POST。 只要给他们相同的CssClass名称。
使用“返回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将永远不会发布post。 它总是触发GET请求。
这里是一个回答默认的ASP.NET MVC 5项目的一个答案,我相信在UI中很好地完成我的样式目标。 表单提交使用纯JavaScript的一些包含的forms。
@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> }
使用以下的“调用操作链接”:
<%= 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;" })
;)
我对这个问题的解决scheme是相当简单的。 我有一个页面,做一个由整个电子邮件和其他部分的客户search,部分拉和显示一个列表,列表有一个动作链接,指向一个名为GetByID的动作结果,并通过ID
GetByID为选定的客户提取数据然后返回
return View("Index", model);
这是后期的方法
这是我解决的一个难题。 我怎样才能build立在剃刀和HTMLdynamic链接,可以调用一个动作方法,并将一个或多个值传递给一个特定的动作方法? 我考虑了几个选项,包括一个自定义的HTML帮手。 我刚想出一个简单而优雅的解决scheme。
风景
@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。 它将访问任何types的方法。 您可以将数据传递给使用的操作方法
@Url.Action(string actionName, string controllerName, object routeValues)
routeValues对象。 我试过这个,它的工作原理。 不,你没有在技术上做一个职位或提交表单,但如果routeValues对象包含您的数据,它不关心,如果它的职位或得到。 您可以使用特定的操作方法签名来select正确的方法。
这是我对这个问题的解决scheme。 这是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>
兴趣点在剃刀视图 :
-
当使用
@Html.ActionLink
生成的链接被点击时,JavaScript函数confirmDelete(id)
被调用; -
confirmDelete()
函数需要被点击的项目的id。 这个项目是传递onClick
处理程序confirmDelete("+feedback.Id+");return false;
注意处理程序返回false以防止默认操作 – 这是获取请求的目标。 button的OnClick
事件可以附加jQuery列表中的所有button作为替代(可能会更好,因为它将在HTML页面中的文本less,数据可以通过data-
属性传递)。 -
窗体有
id=myForm
,以便在confirmDelete()
find它。 -
表单包括
@Html.HttpMethodOverride(HttpVerbs.Delete)
以便使用HttpDelete
动词,作为用HttpDeleteAttribute
标记的HttpDeleteAttribute
。 -
在JS函数中,我使用动作确认(在外部插件的帮助下,但标准确认也可以正常工作)。不要忘记在callback
var that=this
使用bind()
或者var that=this
(不pipe你喜欢什么)。 -
表单有一个
id='idField'
和name='id'
的隐藏元素。 因此,在确认之后提交表单(result==true
)之前,隐藏元素的值被设置为传递参数的值,浏览器将数据提交给控制器,如下所示:
请求URL : http://localhost:38874/Feedback/Delete
请求方法 :POST状态码:302find
响应头
位置:/反馈主机:localhost:38874 表单数据 X-HTTP-Method-Override:DELETE id:5
正如你所看到的,它是使用X-HTTP-Method-Override的POST请求:DELETE和正文中的数据设置为“id:5”。 响应有302个代码redirect到索引动作,通过这个你删除后刷新你的屏幕。
为了POST,你需要提交表单数据。 我不认为用ActionLink可以做到这一点。 看看这个链接 。
我build议保持纯粹的REST原则和使用HTTP删除您的删除。 不幸的是,HTML规范只有HTTP Get&Post。 一个标签只能是一个HTTP Get。 表单标签可以做一个HTTP Get或Post。 幸运的是,如果你使用Ajax,你可以做一个HTTP删除,这就是我推荐的。 详细信息请看下面的post: Http删除
我使用以下代码完成了相同的问题:
@using (Html.BeginForm("Delete", "Admin")) { @Html.Hidden("ProductID", item.ProductID) <input type="submit" value="Delete" /> }
调用$ .post()将不起作用,因为它是基于Ajax的。 所以需要为此而使用混合方法。
以下是为我工作的解决scheme。
步骤:1.创buildURL调用一个方法与URL和参数2.使用JavaScript方法调用普通POST
解:
在.cshtml中:
<a href="javascript:(function(){$.postGo( '@Url.Action("View")', { 'id': @receipt.ReceiptId } );})()">View</a>
注意:匿名方法应该包装在(….)()中
(function() { //code... })();
postGo在JavaScript中定义如下。 rest很简单..
@ Url.Action(“View”)为该调用创buildurl
{'id':@ receipt.ReceiptId}将参数创build为对象,然后在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的参考URL
非Ajax GET / POST使用jQuery(插件?)
jQuery.post()
将工作,如果你有自定义数据。 如果你想发布现有的表单,使用ajaxSubmit()
更容易。
你不必在ActionLink
本身设置这个代码,因为你可以在document.ready()
事件(无论如何这是首选的方法)中附加链接处理程序,例如使用$(function(){ ... })
jQuery的伎俩。
遇到这个需要从一个search(索引)页面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)