asp.net дважды запрещает отправку формы - PullRequest
8 голосов
/ 26 марта 2010

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

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

Ответы [ 4 ]

14 голосов
/ 27 марта 2010

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

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

Пояснение:

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

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

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

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

Дополнительные ресурсы:

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

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

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

5 голосов
/ 27 марта 2010

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

Пост - Перенаправление - Получить

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

0 голосов
/ 27 марта 2010

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

0 голосов
/ 26 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...