Я ранее задавал вопрос об этом , получил интересный ответ , который заставил меня подняться, хорошо задавая больше вопросов.Итак, вот следующий вопрос в моем путешествии, чтобы выяснить внутреннюю работу постов 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
включается во все мои сообщения.Я не хватаю это и не добавляю это, я ничего с этим не делаю, на самом деле это просто так.Может кто-нибудь, пожалуйста, пролить свет на то, почему это работает.Мне не нравятся случайные решения, они обычно ломаются позже.