Как избежать событий кнопки при обновлении страницы

У меня есть страница .aspx, на которой данные вставляются в базу данных одним нажатием кнопки. Но когда я нажимаю кнопку, все идет правильно. Я получаю сообщение «Успешно» как «успешно вставленные данные». В этой ситуации, если я нажимаю «F5» или обновляю страницу, запускается событие нажатия кнопки. Почему так должно быть? Как избежать этого состояния?


person Red Swan    schedule 30.01.2010    source источник
comment
можешь добавить свой код ??   -  person bala3569    schedule 30.01.2010


Ответы (4)


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

ИМХО, лучший способ - использовать шаблон Post / Redirect / Get. В вашем коде сразу после точки сохранения данных сделайте 302 редирект на страницу подтверждения:

protected void btnSaveStuff_Click(object sender, EventArgs e)
{
    SaveStuffToDatabase();
    Response.Redirect("confirmation.aspx");
}

При использовании шаблона POST исходной страницы не попадет в историю браузера, а обновление страницы результатов приведет к повторению последнего GET, что должно быть безопасным.

person Jørn Schou-Rode    schedule 30.01.2010
comment
Прочитал статью. но как тогда использовать GET / POST в сценарии основной детали? - person Red Swan; 01.02.2010
comment
Я не уверен, что вы подразумеваете под сценарием основных деталей. Как показано в моем примере кода, вам просто нужно выполнить Response.Redirect, который затем отменит POST и сделает браузер новым GET. - person Jørn Schou-Rode; 01.02.2010
comment
что, если в конце сохранения данных необходимо показать какое-то сообщение на дисплее, в этом случае ответ от @ Love-40 правильный - person fc123; 31.10.2014
comment
@xyz Я бы все равно предпочел сломать POST, выполнив перенаправление. Если вы хотите отобразить экран подтверждения, создайте его на отдельном URL-адресе и перенаправьте сюда из POST. - person Jørn Schou-Rode; 31.10.2014

Добавьте это в свой класс:

#region Browser Refresh
private bool refreshState;
private bool isRefresh;

protected override void LoadViewState(object savedState)
{
    object[] AllStates = (object[])savedState;
    base.LoadViewState(AllStates[0]);
    refreshState = bool.Parse(AllStates[1].ToString());
    if (Session["ISREFRESH"] != null && Session["ISREFRESH"] != "")
        isRefresh = (refreshState == (bool)Session["ISREFRESH"]);
}

protected override object SaveViewState()
{
    Session["ISREFRESH"] = refreshState;
    object[] AllStates = new object[3];
    AllStates[0] = base.SaveViewState();
    AllStates[1] = !(refreshState);
    return AllStates;
}

#endregion 

И в вашей кнопке нажмите, сделайте это:

protected void Button1_Click(object sender, EventArgs e)
{
    if (isRefresh == false)
    {
        Insert Code here
person live-love    schedule 04.11.2011
comment
хороший ответ. не могли бы вы объяснить здесь свой код? Спасибо - person fc123; 31.10.2014
comment
Я предполагаю, что LoadViewState и SaveViewState нужно подключить к какому-то событию (ям)? Какие из них и / или как вы это делаете? - person RBarryYoung; 02.04.2015
comment
Ницца! Я поместил код на свою базовую страницу и использовал условие if на странице, где присутствует событие нажатия кнопки. это сработало здорово! хорошая работа +1 для тебя - person Pranesh Janarthanan; 10.09.2016
comment
Я использовал ваш код, у меня возникла проблема: если мое событие нажатия кнопки не является Ajax, тогда isrefresh истинно при первом нажатии кнопки, поэтому, если я нажимаю кнопку во второй раз, Isrefresh будет ложным, и данные будут отправлены в БД. - person Pranesh Janarthanan; 09.06.2017

Добавьте панель обновлений и установите для нее режим обновления «Условный». Это сработало для меня !!

person user1808229    schedule 23.06.2014

При обновлении будет повторно отправлена ​​форма, которую вы отправили в последний раз, когда вы нажали кнопку.

Обычно, когда вы обновляете страницу, вы думаете о том, чтобы снова получить страницу или выполнить HTTP GET, но поскольку последнее, что вы сделали, это POST (когда вы нажали кнопку отправки), браузер снова выполнит публикацию, чтобы попытаться вызвать тот же ответ.

Я предлагаю использовать шаблон Post / Redirect / Get, предложенный Йорн Скоу-Роде.

Эта статья тоже кажется актуальной. http://aspalliance.com/687_Preventing_Duplicate_Record_Insertion_on_Page_Refresh

person TJB    schedule 30.01.2010
comment
Я не думаю, что вторая ссылка, которую вы предоставили, используется полностью. Мне нужно слишком много казни, верно? действительно код хороший, но не правильный. См. Если у меня 100 страниц, поэтому в соответствии с этой статьей мне нужно кодировать на каждой странице с соответствующими полями. Что неверно. Есть ли другой способ ?? пожалуйста - person Red Swan; 10.02.2010