ASP.NET MVC 3:如何强制ActionLink执行HttpPost而不是HttpGet?

6

是否有可能强制@Html.ActionLink()执行POST而不是GET?如果可以,如何操作?


1
不可以,它们只能用于GET请求。 - VJAI
5个回答

9

ActionLink助手方法将呈现一个anchor标签,点击它总是会发起一个GET请求。如果您想要将其变成一个POST请求,您应该使用一些JavaScript来覆盖默认行为。

@ActionLink("Delete","Delete","Item",new {@id=4},new { @class="postLink"})

现在是一些关于 jQuery 代码的部分。
<script type="text/javascript">
  $(function(){
    $("a.postLink").click(function(e){
      e.preventDefault();
      $.post($(this).attr("href"),function(data){
          // got the result in data variable. do whatever you want now
          //may be reload the page
      });
    });    
  });    
</script>

请确保您有一个HttpPost类型的Action方法来处理此请求。

[HttpPost]
public ActionResult Delete(int id)
{
  // do something awesome here and return something      
}

8
我想如果你需要这样的东西,是为了在服务器端执行某些“永久”的操作,比如删除数据库中的对象。
以下是使用链接和发布进行删除的完整示例: http://www.squarewidget.com/Delete-Like-a-Rock-Star-with-MVC3-Ajax-and-jQuery 从前面的链接(无论如何都建议阅读)中可以看到:
在视图中有一个删除链接:
@Ajax.ActionLink("Delete", "Delete", "Widget",
                new {id = item.Id},
                new AjaxOptions {
                    HttpMethod = "POST",
                    Confirm = "Are you sure you want to delete this widget?",
                    OnSuccess = "deleteConfirmation"
                }) 

一些JS代码:
function deleteConfirmation(response, status, data) {

        // remove the row from the table
        var rowId = "#widget-id-" + response.id;
        $('.widgets').find(rowId).remove();

        // display a status message with highlight
        $('#actionMessage').text(response.message);
        $('#actionMessage').effect("highlight", {}, 3000);
    }

1
很棒的链接。希望我能将两个答案都标记为正确,所以希望点赞就足够了。谢谢。 - wgpubs

4
我会做的是将您的HTML代码包裹在一个表单里面。
@using(Html.BeginForm("YourAction","YourController", FormMethod.Post)){

<button>Hello</button>

}

如果您想要使用按钮而非链接,可以考虑使用按钮元素。

如果您确实需要使用链接,您可能需要一些JavaScript代码。

类似于以下内容:

$("#idOfYourLink").click(function(){
var form = $(this).parents('form:first');
form.submit();
});

1

一个 <a> 元素不可能执行 POST 到 Web 服务器。

你可以使用 JavaScript 来捕获点击事件,停止导航,并执行 AJAX POST 到服务器,但如果用户禁用了 JavaScript,什么也不会发生。

你必须使用一个 <a> 元素吗?还是只需要类似于 <a> 元素的东西?

另外值得一提的是看看 AjaxLink。它允许您轻松地使用 <a> 元素执行 AJAX POST。


0

如果你认为...在HTML中没有标签可以执行POST。这就是为什么你不能强制链接执行POST(而且这毫无意义)。 要使用“POST”,你应该“POST”一些东西。那个东西应该是一个表单,或者你可以使用一个用于AJAX的javascript函数进行POST。 无论如何,如果你需要POST而不提交任何内容,你应该检查你的资源模型,有些地方可能出了问题。


这在Rails社区中是非常普遍且完全可接受的,例如作为删除对象的一种方式。 - wgpubs

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