asp.net дважды запрещает отправку формы

У меня есть веб-приложение веб-формы (asp.net 2.0). Когда пользователь отправляет форму, у меня появляется ссылка на отправку, поэтому он не может отправить ее снова. Тем не менее, они могут нажать F5, и это вызывает еще одну вставку в базу данных, что я не хочу, чтобы это произошло.

Есть ли какая-то настройка, которую я могу установить, если / когда они нажимают F5, чтобы сообщить странице - не отправлять снова?

4 ответа

Похоже, вы выполняете обратную передачу на ту же страницу, затем вставляете ее в базу данных перед повторным отображением той же страницы для пользователя, минус кнопка отправки?

Если это так, самый простой способ решить эту проблему - это Response.Redirect() на ту же страницу - поэтому, когда пользователь нажимает F5, он перезагрузит запрос GET на страницу вместо POST.

Объяснение:

Когда вы выполняете обратную передачу в ASP.NET, браузер отправляет POST-запрос на сервер. Я не знаю вашего опыта работы с HTTP-методами, но даже если вы новичок в веб-программировании, вы, вероятно, испытали влияние этих типов запросов в браузерах. Иногда, когда вы отправляете формы на веб-сайтах и ​​нажимаете кнопку "Назад", он говорит что-то вроде "хотите ли вы повторно отправить данные формы". Это потому, что эти формы отправляют данные на сервер, используя метод HTTP POST. Эффект кнопки "Назад" в этом случае такой же, как и при нажатии клавиши F5 - браузер повторяет один и тот же запрос POST снова (для этого требуется некоторый тип данных формы, и в этих случаях это те же данные, которые вы отправили в последний раз). время).

Когда вы используете Response.Redirect()сервер выдает код состояния HTTP 302 (ресурс временно перемещен) в ответ на запрос. Затем браузер теперь выдаст запрос GET для ресурса, на который ему было сказано перенаправить (в данном случае, на ту же самую точную страницу).

Теперь, когда вы находитесь на странице, она возвращается, как если бы вы посетили ее по ссылке или ввели прямо в адресную строку. Если вы нажмете F5 на этот раз, будет выдан запрос GET, а не POST.

Я бы порекомендовал вам скачать Firebug и активировать панель "Net". Вы можете точно увидеть, что составляет запрос / ответ, а также список всех запросов, сделанных на вашей странице.

Больше ресурсов:

Если вы любите приключения, вы можете проверить еще больше кодов состояния (и, кстати, я фактически использовал 418 в приложении, над которым я работаю как хакер, чтобы обойти проверку подлинности с помощью форм для ASP.NET).

Если Firebug недостаточно, вы можете скачать Fiddler и собственноручно и воспроизвести запросы по своему вкусу.

Если вам недостаточно GET и POST, вы можете использовать другие методы для изменения состояний в вашем приложении. Возможно, вы слышали об архитектуре RESTful, которая в основном использует методы HTTP GET, PUT, POST и DELETE, как и было задумано.

Вы можете попробовать это. Если это не соответствует вашим потребностям, по крайней мере, это полезно знать.

Post - Redirect - Get

http://en.wikipedia.org/wiki/Post/Redirect/Get

Недавно была опубликована статья о Code Project, в которой был представлен способ обработки нежелательных обновлений с помощью HttpModule, скрытого поля и некоторого JavaScript. Возможно, он вам не подходит, но это изящное решение, которое не зависит от ViewState или Session.

Вы можете сделать несколько вещей. Сохраните логическое значение во ViewState. Проверьте / установите свойство. Сохраните логическое значение в сеансе и проверьте / установите его.

При обратной передаче вы устанавливаете значение и, если оно равно true, предотвращаете отправку и повышаете / отображаете ошибку.

Другие вопросы по тегам