MVC 3 AJAX和[ValidateAntiForgeryToken]

时间:2011-09-01 12:37:33

标签: jquery asp.net-mvc-3 antiforgerytoken

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被包含在我的所有帖子中。我没有抓住它并附加它,我没有做任何事情它真的就在那里。有人可以说明为什么会这样。我不喜欢偶然的解决方案,他们通常会在以后休息。

1 个答案:

答案 0 :(得分:0)

@Html.AntiForgeryToken()在您的表单中创建<input type='hidden' name='__RequestVerificationToken'/>或类似内容。如果我理解正确的话:var _allFormData = $(this).parents().find('form');与此结合:data: $(_allFormData).serialize()将所有表单数据发布到服务器,包括MVC可能查找的输入字段__RequestVerificationToken