MVC 3 AJAX и [ValidateAntiForgeryToken] - PullRequest
       18

MVC 3 AJAX и [ValidateAntiForgeryToken]

2 голосов
/ 01 сентября 2011

Я ранее задавал вопрос об этом , получил интересный ответ , который заставил меня подняться, хорошо задавая больше вопросов.Итак, вот следующий вопрос в моем путешествии, чтобы выяснить внутреннюю работу постов AJAX и довольно раздражающий ValidateAntiForgeryTokenAttribute.

У меня есть _layout.cshtml, здесь находятся все вкусности скриптов длясейчас.У меня есть страница входа в систему, на которой отображаются три части: одна для логинов OpenID, которая является обычным @using(Html.BeginForm()) {}, другая для локального входа, а другая для базовой регистрации.Частичный вход в систему и частичный регистр используют ViewModels и Ajax.BeginForm

Обратите внимание, что я использую @using Ajax.BeginForm и получаю атрибут data-ajax-update attr для обновления элемента в случае успеха

Scriptв _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 голосов
/ 01 сентября 2011

@Html.AntiForgeryToken() создает <input type='hidden' name='__RequestVerificationToken'/> или нечто подобное внутри вашей формы.И если я правильно понимаю это: var _allFormData = $(this).parents().find('form'); в сочетании с этим: data: $(_allFormData).serialize() отправьте все данные вашей формы на сервер, включая поле ввода __RequestVerificationToken, которое, вероятно, ищет MVC,

...