ASP.NET MVC ActionLink 和 post 方法

104

请问有人能告诉我如何使用ActionLink和POST方法将值提交给控制器吗?
我不想使用按钮。
我猜这与jquery有关。


1
我写了一个类似于Html.ActionLink的方法,只不过它构建的是带有提交按钮的POST表单。我会看看是否可以提供选项来用链接替换提交按钮以提交表单。请参见此处:https://dev59.com/YU_Ta4cB1Zd3GeqPCqz9#29155696 - nikib3ro
17个回答

72
如果您正在使用ASP MVC3,可以使用Ajax.ActionLink(),它允许您指定HTTP方法,您可以将其设置为"POST"。

50
请注意,为使其正常工作,您需要包含其中一个ajax的JavaScript文件,例如"jquery.unobtrusive-ajax.min.js"。否则,当单击时它将继续执行GET而不是POST。创建链接的语法如下:@Ajax.ActionLink("Delete", "Delete", new { id = item.Id }, new AjaxOptions {HttpMethod = "POST"}) - CodingWithSpike
1
不引人注目的Ajax运行良好,但我必须使用动作链接略有不同,传递一个字典作为参数,而不是这个AjaxOptions对象:https://dev59.com/nGPVa4cB1Zd3GeqP7Z0z#10657891 另外,我必须手动传递ajax属性,以便JS可以捕获和覆盖单击事件,它们是"data-ajax"="true,"data-ajax-url"=<your link>和"data-ajax-method"="Post"。顺便说一下,我正在使用ASP.NET MVC 3。 - Felipe Sabino
1
@CokoBWare 这个问题 https://dev59.com/nGPVa4cB1Zd3GeqP7Z0z#10657891?真的吗?对我来说似乎没有出现问题... - Felipe Sabino

60

你不能使用ActionLink,因为那只会渲染一个锚点<a>标签。

你可以使用jQuery AJAX post

或者直接调用表单的提交方法,可以使用jQuery或者不使用jQuery(这将不是AJAX),也许在任何你喜欢的控件的onclick事件中调用。


22

你可以使用jQuery为所有按钮执行POST请求。只需给它们相同的CssClass名称即可。

如果你想在提交后执行服务器端的RedirectToAction,只需在onclick javascript事件的末尾使用"return false;",否则只需返回视图。

Razor代码

@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);
}

@goodies4uall 的确如此,这个答案就是这样做的。 :) CSS 类名为“saveButton”(可能是一个误导性的名称),但是使用锚标签来启动操作。 - Savantes

21

@Aidos给出了正确答案,只是想澄清一下,因为它被@CodingWithSpike放在他的帖子的评论中隐藏起来了。

@Aidos有正确答案,但由于它被@CodingWithSpike放在他的帖子评论中,所以我想让它更加清晰明了。

@Ajax.ActionLink("Delete", "Delete", new { id = item.ApkModelId }, new AjaxOptions { HttpMethod = "POST" })

9

我认为在默认的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>
}

4

ActionLink永远不会触发POST请求,它总是触发GET请求。


2
这段内容取自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>
            }
        }

2

使用以下内容调用操作链接:

<%= Html.ActionLink("Click Here" , "ActionName","ContorllerName" )%>

要提交表单值,请使用:

 <% using (Html.BeginForm("CustomerSearchResults", "Customer"))
   { %>
      <input type="text" id="Name" />
      <input type="submit" class="dASButton" value="Submit" />
   <% } %>

它将向客户控制器和客户搜索结果操作提交数据。

1

在 Ajax.BeginForm 中使用此链接

@Html.ActionLink(
    "Save", 
    "SaveAction", 
    null, 
    null, 
    onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" })

;)


1
我已经使用以下代码解决了相同的问题:

@using (Html.BeginForm("Delete", "Admin"))
{
       @Html.Hidden("ProductID", item.ProductID)
       <input type="submit" value="Delete" />
}

如果页面上有许多项目,您需要将每个项目包装到表单中,因此会生成许多表单。 另外,<input type=submit> 会呈现按钮而不是链接。 - Vitaliy Markitanov
@VitaliyMarkitanov,您建议使用jQuery ajax吗? - isxaker
看看我在本主题下面的帖子,我在那里解释了我的解决方案。 - Vitaliy Markitanov
在MVC示例项目中,这也几乎是他们所做的。 - Maya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接