C # - Если пользователь обновляет страницу после вставки записи, создается повторяющаяся запись.Как я могу предотвратить это? - PullRequest
3 голосов
/ 19 октября 2011

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

Ответы [ 5 ]

4 голосов
/ 19 октября 2011

Я полагаю, вам следует взглянуть на шаблон PRG (Post / Redirect / Get)

Post / Redirect / Get (PRG) - это общий шаблон проектирования длявеб-разработчикам, которые помогают избежать дублирования некоторых форм и позволяют пользовательским агентам вести себя интуитивно с закладками и кнопкой обновления

В ASP.NET:

  1. POST - кнопка «Отправить»щелчок вызывает HTTP POST
  2. REDIRECT + GET - HttpResponse.Redirect ()

MSDN, Перенаправление пользователей на другую страницу

В коде сервера вы можете программно перенаправить, вызвав метод Redirect.Метод отправляет команду в браузер пользователя, которая заставляет браузер выдавать команду HTTP GET для целевой страницы.

Несколько важных замечаний относительно шаблона PRG:

!!! Шаблон PRG не может охватывать каждый сценарий повторной отправки формы.Некоторые известные повторные представления формы, которые PRG не может решить:

  • , если веб-пользователь возвращается к веб-форме и повторно отправляет ее.
  • , если веб-пользователь нажимает кнопку отправки несколько раздо загрузки ответа сервера (может быть предотвращено с помощью JavaScript для отключения кнопки после первого щелчка).
  • , если веб-пользователь обновляется до завершения первоначальной отправки из-за задержки сервера, что приводит к дублированию HTTP POSTзапрос в определенных пользовательских агентах.
  • , если злонамеренный веб-пользователь отправляет форму дважды, несмотря на меры безопасности на стороне клиента и типичное поведение браузера.
3 голосов
/ 19 октября 2011

Вы должны узнать о шаблоне PRG (Post / Redirect / Get):

Post / Redirect / Get (PRG) - это общий шаблон проектирования для веб-разработчиков. чтобы избежать определенных повторных представлений формы и позволить агентам пользователя вести себя более интуитивно с закладками и кнопкой обновления.

Источник: http://en.wikipedia.org/wiki/Post/Redirect/Get

Обычно вам нужно перенаправить через GET-запрос после того, как пользователь выполнил POST.

2 голосов
/ 19 октября 2011

Вы можете проверить уже существующее условие перед вставкой записи в базу данных.

Как и в хранимой процедуре, вы можете проверить

, если не существует (выберите идентификатор из таблицы, где имя столбца = 'test').

1 голос
/ 19 октября 2011

Простой способ - использовать javascript для отключения кнопки, когда пользователь нажимает на нее.

Способ, который я использую, чтобы избежать обновления, когда требуется высокий уровень безопасности, - это использование небольшого «токена» в сеансе. Допустим, мы поместили небольшое 32-битное целое число в нашу сессию.

Страница будет содержать скрытый ввод, содержащий наш маленький целочисленный токен. Каждый раз, когда мы получаем запрос страницы, мы увеличиваем этот токен на единицу и, прежде чем сделать это, мы проверяем на равенство с тем, который получен в запросе.

Если они совпадают, это не обновление. Если они не совпадают, это обновление.

Это также блокирует попытки сделать назад и далее с помощью кнопок браузера.

Конечно, в тот момент, когда токен не совпадает, страница должна измениться, иначе у вас снова возникнет проблема обновления. Должно отображаться что-то вроде «эй, обновление назад или следующее не разрешено, нажмите здесь, чтобы продолжить».

Для повышения безопасности вы можете xor это целое число со значением costant, зависящим, например, от некоторого другого значения, которое является постоянным в сеансе.

1 голос
/ 19 октября 2011

Это примерно PRG . Простой способ избежать этого - снова перенаправить пользователя на ту же страницу:

Страница: Update.aspx

void btnUpdate_click(object sender, EventArgs e){
    // do your update here
    Response.Redirect("Update.aspx");
}

Это создаст redirect-header в Resoinse, а браузер создаст GET запрос к Update.aspx странице. И если пользователь обновит страницу, будет отправлено GET. Посмотрите:

  1. Пользователь отправляет форму: POST
  2. Сервер делает обновления, возвращает заголовок redirect
  3. Браузер получает response в качестве команды перенаправления: REDIRECT
  4. Браузер отправляет GET запрос на ту же страницу на сервер: GET
  5. Браузер получает response ответ на GET
  6. Если пользователь обновляет страницу: последняя команда браузера была GET, поэтому не будет запускать submit снова
...