Запрет обновления страницы в C # - PullRequest
4 голосов
/ 05 апреля 2009

Дубликат Событие кнопки Asp.Net при обновлении запускается снова ??? GUID

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

Кто-нибудь знает какой-либо метод предотвращения обновления страницы без перенаправления страницы на ту же страницу снова?

что-то вроде if (page.isRefresh) или что-то ... или, если существует, любое решение javascript лучше.

это видно, работает .... но когда я обновляю, он не выполняет обратную передачу, а показывает значение before в текстовом поле

http://www.dotnetspider.com/resources/4040-IsPageRefresh-ASP-NET.aspx

private Boolean IsPageRefresh = false;
protected void Page_Load(object sender, EventArgs e)
{        
    if (!IsPostBack)
    {
        ViewState["postids"] = System.Guid.NewGuid().ToString();
        Session["postid"] = ViewState["postids"].ToString();
        TextBox1.Text = "Hi";

    }
    else
    {
        if (ViewState["postids"].ToString() != Session["postid"].ToString())
        {
            IsPageRefresh = true;
        }
        Session["postid"] = System.Guid.NewGuid().ToString();
        ViewState["postids"] = Session["postid"];
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    if (!IsPageRefresh) // check that page is not refreshed by browser.
    {
        TextBox2.Text = TextBox1.Text + "@";

    }
}

Ответы [ 5 ]

8 голосов
/ 05 апреля 2009

Спасибо за комментарии и извините за мою ошибку, Я нашел этот код в: http://www.codeproject.com/KB/aspnet/Detecting_Refresh.aspx И на этот раз проверено;)

    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());
        _isRefresh = _refreshState == bool.Parse(Session["__ISREFRESH"].ToString());
    }

    protected override object SaveViewState()
    {
        Session["__ISREFRESH"] = _refreshState;
        object[] AllStates = new object[2];
        AllStates[0] = base.SaveViewState();
        AllStates[1] = !(_refreshState);
        return AllStates;
    }

    protected void btn_Click(object sender, EventArgs e)
    {
        if (!_isRefresh)
            Response.Write(DateTime.Now.Millisecond.ToString());
    }
4 голосов
/ 05 апреля 2009

Вы можете проверить свойство Page.IsPostBack, чтобы увидеть, отвечает ли страница на первоначальный запрос или обрабатывает PostBack, такой как событие нажатия кнопки. Вот немного больше информации: w3schools на IsPostBack

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

Если вы выполняете задачу, такую ​​как выполнение CRUD для некоторых данных, вы можете Response.Rirectirect пользователь обратно на ту же страницу, когда вы закончите обработку и обойти эту проблему. Дополнительным преимуществом является перезагрузка вашего контента (при условии, что вы добавили запись в БД, которая теперь будет отображаться на странице ...) и предотвращает поведение проблемы обновления. Единственное предостережение - они все еще передают форму, возвращаясь в свою историю.

Постбэки были плохим выбором реализации для Asp.net и, как правило, разрушают платформу Webforms для меня.

1 голос
/ 15 июня 2013
     bool IsPageRefresh ;

 if (Page.IsPostBack)
    {
        if (ViewState["postid"].ToString() != Session["postid"].ToString())
            IsPageRefresh = true;
    }
    Session["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postid"] = Session["postid"];
1 голос
/ 22 февраля 2012

Это не решает проблему.

Прежде всего, сохранение токена в состоянии просмотра не очень хорошая идея, поскольку его можно отключить. Вместо этого используйте состояние управления. Хотя HttpModule - лучшее решение.

В общем, все равно это не сработает. Если вы откроете другую вкладку / окно, сеанс будет недействительным для предыдущей вкладки / окна. Поэтому тормозя это. Вы должны каким-то образом сохранять уникальное значение при каждой первой загрузке страницы. Используйте это, чтобы определить, откуда поступил запрос, а затем проверьте «обновить билет». Как вы можете видеть, объект для одного пользователя может стать довольно большим в зависимости от количества запросов, где и как долго вы храните эту информацию.

Боюсь, я не видел никакого решения, так как оно довольно сложное.

0 голосов
/ 06 мая 2019

Я пробовал много способов, и в итоге я искал данные формы, отправленные при запуске обратной передачи / обновления ... Я обнаружил, что есть ключ для любого созданного VIEWSTATE, и вы можете просто сравнить эти ключи как ...

Я поместил это на свою пользовательскую базовую страницу, чтобы использовать ее как свойство

public bool IsPageRefresh = false;
protected void Page_Init(object sender, EventArgs e)
{
     if (IsPostBack)
     {
          var rForm = Request.Form;
          var vw = rForm["__EVENTVALIDATION"].ToString();
          var svw = Session["__EVENTVALIDATION"] ?? "";
          if (vw.Equals(svw)) IsPageRefresh = true;
               Session["__EVENTVALIDATION"] = vw;
     }
}
...