Html.Action() вызывает Обязательное поле формы защиты от подделки __RequestVerificationToken отсутствует исключение

На той же странице у меня есть 2 формы. Один из них — простая подписка на информационный бюллетень, другой — форма оплаты Braintree «Drop-in».

Когда я отправляю форму Braintree, после отправки формы я получаю The required anti-forgery form field "__RequestVerificationToken" is not present исключение при перезагрузке страницы относительно формы информационного бюллетеня.

Это действительно странно, учитывая, что форма рассылки работает отлично, и я не вижу причин, по которым отправка одной формы должна генерировать такое исключение в другой, особенно при перезагрузке страницы вместо POST.

Это код формы рассылки, которая содержится в PartialView:

@using (Ajax.BeginForm("SubscribeForm", "Components"))
{
    @Html.AntiForgeryToken()
    // other inputs omitted for brevity
}

Я визуализирую его в нижнем колонтитуле, используя @Html.Action("SubscribeForm", "Components"). Это ComponentsController с действиями GET и POST:

 public ActionResult SubscribeForm()
 {
     // do stuff
     return PartialView("_SubscribeForm", viewModel);
 }

 [HttpPost]
 [ValidateAntiForgeryToken]
 public ActionResult SubscribeForm(SubscribeViewModel model)
 {
     // do stuff
 }

И это исключение:

введите здесь описание изображения

Любая идея, что может вызвать такое поведение?


person tocqueville    schedule 01.12.2016    source источник
comment
Это может быть связано с тем фактом, что @Html.Action() будет вызывать метод POST, а не метод GET, если текущий запрос является POST. Можете ли вы показать подписи методов контроллера, включая атрибуты   -  person    schedule 01.12.2016
comment
Действительно? Я этого не знал. Я обновил свой вопрос, включив в него код ComponentsController, который обрабатывает действие SubscribeForm.   -  person tocqueville    schedule 01.12.2016
comment
ОК, можете ли вы проверить это, изменив метод POST на public ActionResult Subscribe(SubscribeViewModel model) и настроив форму на @using (Ajax.BeginForm("Subscribe", "Components")) для соответствия.   -  person    schedule 02.12.2016
comment
Боже, ты прав... действительно хорошо замечен. Поскольку действия POST и GET имеют одно и то же имя, Html.Action в данном случае вызывал POST. Я предполагал, что это всегда будет получать GET... Большое спасибо.   -  person tocqueville    schedule 02.12.2016
comment
Обычно это нормально (и предпочтительно) иметь одно и то же имя, но это просто неприятная проблема при использовании @Html.Action()   -  person    schedule 02.12.2016


Ответы (1)


Вы должны опубликовать свою форму, в которой присутствует проверочный токен. Для этого рассмотрите возможность использования кнопки отправки/тега ввода.

@using (Ajax.BeginForm("SubscribeForm", "Components")) {
@Html.AntiForgeryToken()
<input type="submit" value="Log in" class="btn btn-default" /> }
person Douglas Gandini    schedule 01.12.2016
comment
@Html.Action() НЕ генерирует ссылку - он вызывает метод сервера и отображает его результат. - person ; 01.12.2016
comment
Вопрос не имеет ничего общего с кнопкой отправки. - person ; 02.12.2016