Обновление после обратной передачи приводит к повторной отправке тех же данных - PullRequest
0 голосов
/ 16 марта 2012

У меня есть форма для редактирования информации о сотруднике. Если пользователь желает ввести новый адрес электронной почты для выбранного сотрудника, есть текстовое поле и кнопка с надписью «Добавить адрес электронной почты». Очень просто, вы вводите адрес электронной почты, нажимаете Добавить адрес электронной почты. Он выполняет обратную передачу, и обработчик событий этой кнопки выполняет INSERT для базы данных.


Проблема: Если вы нажмете F5, чтобы обновить страницу после этой обратной передачи, произойдет та же самая обратная передача, даже если текстовое поле пустое. Другими словами, каждый раз, когда вы нажимаете F5, действия в обработчике событий для этой кнопки Добавить адрес электронной почты повторяются снова. Если я нажимаю F5 десять раз, один и тот же адрес электронной почты появляется в базе данных десять раз.


В одном предложении, которое я нашел, говорилось: «просто перенаправьте на ту же страницу после того, как вы примените свои изменения». Причина, по которой это не идеально в нашем случае, состоит в том, что это довольно длинная форма данных о сотрудниках - если пользователь вносит кучу изменений в общую форму (например, FirstName, LastName и т. Д.), А затем делает электронную Добавление почты до применения изменений в другом месте, эти изменения в другом месте будут потеряны, если мы перенаправим на ту же страницу.

Очень длинное решение, которое я могу придумать, - это захватить все данные в ViewState, перенести их через перенаправление на ту же страницу, а затем использовать строку запроса в URL, чтобы определить, хотим ли мы заполнить данные из ViewState. Прежде чем приступить к этому пути, я надеюсь, что вместо этого есть какой-то метод, который я просто не знаю, который говорит, например, PostbackButDontRetainPostbackData () (желаемое за действительное, я знаю).

1 Ответ

0 голосов
/ 16 марта 2012

В обработчике для этой кнопки Добавить адрес электронной почты проверьте, существует ли электронное письмо в базе данных. Если это так, не добавляйте электронное письмо снова и отображайте соответствующее сообщение для пользователя. Обычно формы имеют зарезервированную область, например, скрытый div для этой цели, поэтому в случае, если что-то пойдет не так, div будет заполняться сообщениями об ошибках и отображаться для пользователя.

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

UPDATE

Если вам не нравится показывать какие-либо сообщения пользователю, просто ничего не делайте после того, как вы обнаружите, что электронная почта уже существует в базе данных. e.g.:

public void AddEmailToDB(string email)
{
    // first find out if the email already exists in the database
    bool isDuplicate = ...; 
    // if it does, simply return and do nothing
    if(isDuplicate) return; 

    // if control reaches here then the email is not
    // a duplicate and you can do your normal processing
}

ОБНОВЛЕНИЕ II

Если вы не хотите, чтобы браузеры отображали окно сообщения каждый раз, когда пользователь нажимает клавишу F5 после обратной передачи, вы можете выполнить частичную обратную передачу, используя AJAX, обернув текстовое поле своей электронной почты и кнопку добавления в UpdatePanel , это очень легко использовать.

...