MVC 3 AJAX和

我之前问了一个关于这个问题的问题 ,得到了一个有趣的答案让我开始了,并提出更多问题。 所以这是我的旅程中的下一个问题,即找出AJAXpost的内部工作方式以及相当恼人的ValidateAntiForgeryTokenAttribute

我有一个_layout.cshtml,这是所有脚本好东西现在所在的位置。 我有一个登录页面,它呈现三个部分,一个用于OpenID登录,这只是一个普通的@using(Html.BeginForm()) {} ,一个用于本地登录,另一个用于基本注册。 登录部分和寄存器部分都使用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中的表单元素

 

控制器中的动作方法:

 public ActionResult RegisterMember( RegisterMemberViewModel registerMemberViewModel) { // Process some stuff return PartialView("_Register"); } 

为什么这个工作,神奇地AntiForgeryToken被包含在我的所有post中。 我没有抓住它并附加它,我没有做任何事情它真的就在那里。 有人可以说明为什么这样做有用。 我不喜欢偶然的解决方案,他们通常会在以后打破。

@Html.AntiForgeryToken()@Html.AntiForgeryToken()创建一个或类似内容。 如果我理解正确的话: var _allFormData = $(this).parents().find('form'); 结合这个: data: $(_allFormData).serialize()将所有表单数据发布到服务器,包括MVC可能寻找的inputfield __RequestVerificationToken