Html.AntiForgeryToken() нарушает поведение разбиения на страницы

Контекст

В нашем веб-приложении есть функция, например, «Создать сотрудника». Он показывает три страницы (1 из n), чтобы пользователь мог вводить соответствующую информацию на каждой странице. На странице 3 кнопка «Сохранить» позволяет пользователю сохранить сотрудника. Если пользователь вводит неверное значение в поле на странице 1 (что-то, что сервер может только проверить) и сервер сообщает об ошибке, по умолчанию отображается страница 1 с сообщением об ошибке вверху, а соответствующее поле помечается красным.

Постановка задачи

Все вышеперечисленное работало до тех пор, пока последние несколько сборок не показали поломку. В вышеупомянутом сценарии при ошибке отображается страница 2 вместо страницы 1. Все остальное работает нормально, например, сообщение об ошибке правильное, поле на странице 1 помечено красным.

Анализ

Я попытался изучить логику разбивки на страницы в java-скрипте, вернулся к изменениям версии, которые работали. Я также попробовал решение, предложенное здесь , здесь. Я также очистил кеш браузера и снова открыл его.

Ничего не сработало.

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

Вопрос

  1. Я не уверен, как AntiForgeryToken() влияет на код разбиения на страницы в java-скрипте?
  2. Что я могу попытаться узнать больше о первопричине?
  3. Любое предлагаемое решение, помните, не может жить без AntiForgeryToken()?

Заранее спасибо.


person SBirthare    schedule 20.11.2013    source источник
comment
Этот вопрос кажется слишком локальным. Переформулируйте свой вопрос, чтобы он был общим.   -  person Ramesh    schedule 20.11.2013
comment
@ Рамеш, извини, что не понял тебя. Могу ли я попросить вас быть более конкретным с деталями, которые вам нужны, чтобы понять проблему. Я буду рад добавить больше деталей, если это поможет вам понять проблему.   -  person SBirthare    schedule 20.11.2013
comment
Этот вопрос не поможет людям, посещающим этот сайт. Вы не разделяете свою логику разбиения на страницы. Вы не уверены в первопричине. Мы можем помочь, если в общем случае. Но в этом случае он очень привязан к вашей логике и коду.   -  person Ramesh    schedule 20.11.2013
comment
@Ramesh - Да, вы правы, я не уверен в первопричине, поэтому я разместил здесь сообщение в надежде, что кто-то может указать мне правильное направление, чтобы найти первопричину и, в конечном итоге, правильное решение. Вы подозреваете, что логика разбивки на страницы (это большой кусок кода) может быть виновником? Тогда почему удаление AntoForgeryToken устраняет эту проблему?   -  person SBirthare    schedule 20.11.2013
comment
Если ваша логика разбивки на страницы находится на стороне клиента, что-то должно вызвать ее переход на страницу 2. Я бы посоветовал вам установить точку останова в инструменте разработчика, таком как chrome/firebug, и посмотреть, кто вызывает скрипт. Между проверкой защиты от подделки mvc и вашей пользовательской логикой разбивки на страницы нет никакой связи, если только ваша реализация не делает что-то особенное. Подход, о котором я упоминал выше, может помочь.   -  person Ramesh    schedule 20.11.2013


Ответы (1)


На всякий случай это поможет кому-то еще, кто новичок, как я, в Java Script/JQuery.

Логика разбивки на страницы в Java Script выбирает страницу для отображения на основе индекса, рассчитанного с помощью метода Index() JQuery, и учитывает количество элементов формы.

Поскольку AntiForgeryToken() добавляет скрытый элемент формы, индекс был ошибочно рассчитан как 1 вместо 0 (для страницы 1). Именно эту роль играл AntiForgeryToken().

Решение состоит в том, чтобы передать идентификатор группы разбиения на страницы методу Index(), чтобы он не учитывал никаких других элементов, кроме тех, которые относятся только к разбиению на страницы.

Вот оно.

Извлекая уроки из этой проблемы, всегда будьте более конкретными при поиске HTML-элементов с помощью JQuery или любой другой библиотеки JS. JQuery предоставил средства, но, к сожалению, поскольку раньше все работало, первоначальный автор не использовал возможности метода Index().

person SBirthare    schedule 20.11.2013