ASP.NET MVC ActionLink和post方法

时间:2010-01-12 12:15:15

标签: asp.net-mvc actionlink

有谁能告诉我如何使用ActionLink和POST方法向Controller提交值? 我不想使用按钮 我想它与jquery有关。

17 个答案:

答案 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中的兴趣点

  1. 单击confirmDelete(id)生成的链接时调用的JavaScript函数@Html.ActionLink;

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

  3. 表单已id=myForm,以便在confirmDelete()中找到。

  4. 表单包含@Html.HttpMethodOverride(HttpVerbs.Delete)以使用HttpDelete动词,作为标有HttpDeleteAttribute的操作。

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

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

  7. 请求网址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的参考网址

Non-ajax GET/POST using jQuery (plugin?)

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

答案 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>
            }
        }