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> 

兴趣点在剃刀视图

  1. 当使用@Html.ActionLink生成的链接被点击时,JavaScript函数confirmDelete(id)被调用;

  2. confirmDelete()函数需要被点击的项目的id。 这个项目是传递onClick处理程序confirmDelete("+feedback.Id+");return false; 注意处理程序返回false以防止默认操作 – 这是获取请求的目标。 button的OnClick事件可以附加jQuery列表中的所有button作为替代(可能会更好,因为它将在HTML页面中的文本less,数据可以通过data-属性传递)。

  3. 窗体有id=myForm ,以便在confirmDelete()find它。

  4. 表单包括@Html.HttpMethodOverride(HttpVerbs.Delete)以便使用HttpDelete动词,作为用HttpDeleteAttribute标记的HttpDeleteAttribute

  5. 在JS函数中,我使用动作确认(在外部插件的帮助下,但标准确认也可以正常工作)。不要忘记在callbackvar that=this使用bind()或者var that=this (不pipe你喜欢什么)。

  6. 表单有一个id='idField'name='id'的隐藏元素。 因此,在确认之后提交表单( result==true )之前,隐藏元素的值被设置为传递参数的值,浏览器将数据提交给控制器,如下所示:

请求URLhttp://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(插件?)

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

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)