Как избежать событий кнопки при обновлении страницы - PullRequest
5 голосов
/ 30 января 2010

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

Ответы [ 4 ]

10 голосов
/ 30 января 2010

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

Лучший способ, IMHO, это использовать Шаблон Post / Redirect / Get . В своем коде сразу после точки сохранения данных выполните перенаправление 302 на страницу подтверждения:

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

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

4 голосов
/ 04 ноября 2011

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

#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
1 голос
/ 23 июня 2014

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

0 голосов
/ 30 января 2010

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

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

Я предлагаю использовать шаблон Post / Redirect / Get, предложенный Jorn Schou-Rode .

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

...