2

之前问过一个关于这个的问题,得到了一个有趣的答案,这让我在路上,很好地问了更多问题。因此,这是我探索 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是,它被包含在我的所有帖子中。我没有抓住它并附加它,我没有用它做任何事情,它真的就在那里。有人可以解释一下为什么会这样。我不喜欢意外的解决方案,它们通常会在以后中断。

4

1 回答 1

0

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

于 2011-09-01T12:52:10.940 回答