我正在处理这个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"}
);
答案 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