我之前问过一个关于这个的问题,得到了一个有趣的答案,这让我在路上,很好地问了更多问题。因此,这是我探索 AJAX 帖子的内部工作原理以及相当烦人的ValidateAntiForgeryTokenAttribute
.
我有一个 _layout.cshtml,这是目前所有脚本好东西所在的位置。我有一个登录页面,它呈现三个部分,一个用于 OpenID 登录,这只是一个普通的@using(Html.BeginForm()) {}
,一个用于本地登录,另一个用于基本注册。登录部分和注册部分都使用 ViewModel 和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
是,它被包含在我的所有帖子中。我没有抓住它并附加它,我没有用它做任何事情,它真的就在那里。有人可以解释一下为什么会这样。我不喜欢意外的解决方案,它们通常会在以后中断。