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

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

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


person d3020    schedule 26.03.2010    source источник
comment
Вы можете попробовать этот подход stackoverflow.com/questions/2283043/   -  person Nikos Steiakakis    schedule 27.03.2010


Ответы (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 и УДАЛИТЬ, как они были задуманы.

person John Rasch    schedule 26.03.2010
comment
Джон, ты описал именно то, что я делаю. Куда вы предлагаете поместить Response.Redirect (), чтобы я понял. Прямо сейчас я в основном так и делаю в Page_Load. Если Request.Form [моя кнопка] == имя кнопки ... тогда вызовите некоторые методы для вставки данных. - person d3020; 27.03.2010
comment
Кажется, это работает. Я не совсем понимаю, почему. Может быть, объясни подробнее? В нескольких других ответах предлагалось делать что-то с переменной сеанса и другие подходы, которые казались более сложными. Есть ли проблема с этим решением Response.Redirect ()? В противном случае это кажется гораздо более простым в реализации. - person d3020; 27.03.2010
comment
Джон, спасибо за информацию. Мне определенно нужно поучиться здесь, ценю время и внимательность в ответе. Полезный. Из любопытства, поскольку я собираюсь использовать подход Redirect (), о котором вы пока говорили. Есть ли способ отобразить сообщение пользователю, например, данные уже отправлены, и фактически определить, что то, что он делает, нажимает F5 после того, как уже отправил данные? Еще раз спасибо. - person d3020; 27.03.2010

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

Опубликовать - Перенаправить - Получить

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

person Steve    schedule 26.03.2010

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

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

person Raj Kaimal    schedule 26.03.2010
comment
Он, чтобы избежать повторного нажатия F5, а не повторного нажатия кнопки - в этом случае простое отключение кнопки позволяет избежать двойного ввода. - person Aristos; 27.03.2010

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

person 300 baud    schedule 26.03.2010
comment
Я прочитал и протестировал это решение, и у меня возникают проблемы, если не удается запустить javascript. В любом случае хорошая идея. - person Aristos; 27.03.2010