将MVC Ajax.ActionLink转换为jQuery .post方法?

时间:2011-10-25 18:46:38

标签: jquery asp.net-mvc ajax

我正在处理这个ASP.NET MVC问题,即使用带有AJAX的ValidateAntiForgeryToken打破了AJAX调用(Using ValidateAntiForgeryToken with Ajax.ActionLink)。唯一的解决方案(如该主题中所述)需要jQuery。

如何使用jQuery的.post方法执行以下方面的效果?

@Ajax.ActionLink("Perform HTTPPost", "PostTest", new AjaxOptions{ HttpMethod="POST"})

这是控制器:

// [ValidateAntiForgeryToken]
public class MoreInfoController : Controller
{        
    [HttpPost]
    public ActionResult PostTest()
    {
        return View();
    }
}

以下是包含Javascript和HTML的Index VIEW:

    <script type="text/javascript">
    $(document).ready(function () {
        $('#linkToPost').click(PostForm);
    });

    function PostForm() {
        $.post("/PostTest", $('#testForm').serialize(), function(data) {

        });
        return false;
    }

</script>
<a id="linkToPost" href="#">Perform HTTP Post</a>
<form id="testForm" method="POST" >
    @Html.AntiForgeryToken()
</form>

这是路线:

routes.MapRoute("PostTest1",
                            "PostTest",
                            new {controller = "MoreInfo", action = "PostTest"}
        );

3 个答案:

答案 0 :(得分:1)

我的示例是使用$ .ajax,但您可以轻松将其更改为$ .post

@Html.ActionLink("Perform HTTP Post", "PostTest", "Controller", null, new { id = "someId" })

<script type="text/javascript">
    $(function() {
        $('#someId').click(function() {
            $.post({
                url: $(this).attr('href'),
                type: 'post',
                success: function(data) {
                    // assuming you're returning a partial result
                    $('#somecontainer').html(data);
                }
            });

            // prevent the default action
            return false;
        });
    }
</script>

如果你不想给锚一个id,你可以使用一个类选择器:

$('.ajax-link').click(function() { ... });

而不是new { id = "someId" },你需要做new { @class = "ajax-link" }或任何你想要命名的课程。

修改
我使用了错误的重载。我试图设置html属性的id,而不是路由数据。

答案 1 :(得分:1)

假设您的防伪标记元素位于您要发布的表单中,您可以执行以下操作:

这是您的链接:

<a id="linkToPost" href="#">Perform HTTP Post</a>

以下是绑定此链接点击以发布表单的jquery:

<script type="text/javascript">
   $(document).ready(function() {
      $('#linkToPost').click(PostForm);   
});
function PostForm() {
    $.post("/PostTest", $('#idOfyourForm').serialize(), function(data) {
      // do something with the data that comes back from the post 
    });
    return false;
}

</script>

现在您需要做的是将#idOfYourForm替换为表单的实际ID:

<form id="TestForm">你会成功$('#TestForm').serialize()

接下来,您需要确保我拥有/PostTest的路线实际上会映射到您的控制器和操作。你需要这样的东西:

context.MapRoute("PostTest1",
                 "PostTest",  // URL with parameters
                 new { controller = "MoreInfoController", action = "PostTest" });

就是这样。

答案 2 :(得分:0)

这有效:

[UseAntiForgeryTokenOnPostByDefault]

    public class MoreInfoController: Controller
    {
       [HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult PostTest()
       {
           return View();
       }
    }

观点:

@using (Html.BeginForm("PostTest", "MoreInfo")
{
   @Html.AntiForgeryToken()
   <input type="submit" value="submit"/>
}

其中[UseAntiForgeryTokenOnPostByDefault]为http://weblogs.asp.net/srkirkland/archive/2010/04.aspx