我previously asked a question regarding this,得到了一个interesting answer让我开始前往,提出更多问题。所以这是我的旅程中的下一个问题,即找出AJAX帖子的内部运作方式以及相当恼人的ValidateAntiForgeryTokenAttribute
。
我有一个_layout.cshtml,这是所有脚本好东西现在所在的位置。我有一个登录页面,它呈现三个部分,一个用于OpenID登录,这只是一个普通@using(Html.BeginForm()) {}
,一个用于本地登录,另一个用于基本注册。 login partial和register partial都使用ViewModels和Ajax.BeginForm
请注意我正在使用@using Ajax.BeginForm
并抓取data-ajax-update attr以更新成功元素
_layout.cshtml中的脚本:
$(document).ready(function () {
$('input[type=submit]').live("click", function (event) {
event.preventDefault();
var _allFormData = $(this).parents().find('form');
var _currentForm = $(this).closest('form');
var _updateElement = $(_currentForm).attr("data-ajax-update");
$.ajax({
type: "POST",
url: $(_currentForm).attr('action'),
data: $(_allFormData).serialize(),
success: function (data) {
$(_updateElement).html(data);
}
});
return true;
});
});
_layout.cshtml中的表单元素
<form id="__AjaxAntiForgeryForm" action="#" method="post">
<@Html.AntiForgeryToken()>
</form>
控制器中的操作方法:
public ActionResult RegisterMember(
RegisterMemberViewModel registerMemberViewModel)
{
// Process some stuff
return PartialView("_Register");
}
为什么这有效,神奇地AntiForgeryToken
被包含在我的所有帖子中。我没有抓住它并附加它,我没有做任何事情它真的就在那里。有人可以说明为什么会这样。我不喜欢偶然的解决方案,他们通常会在以后休息。
答案 0 :(得分:0)
@Html.AntiForgeryToken()
在您的表单中创建<input type='hidden' name='__RequestVerificationToken'/>
或类似内容。如果我理解正确的话:var _allFormData = $(this).parents().find('form');
与此结合:data: $(_allFormData).serialize()
将所有表单数据发布到服务器,包括MVC可能查找的输入字段__RequestVerificationToken
,