Как определить обновление страницы в .net

У меня есть событие Button_click. При обновлении страницы снова запускается предыдущее событие Postback. Как определить событие обновления страницы, чтобы предотвратить действие Postback?

Я попробовал приведенный ниже код, чтобы решить эту проблему. На самом деле я добавляю визуальную веб-часть на страницу SharePoint. Добавление веб-части — это событие обратной отправки, поэтому !postback всегда имеет значение false каждый раз, когда я добавляю веб-часть на страницу, и я получаю сообщение об ошибке в цикле else, поскольку ссылка на объект — null.

if (!IsPostBack){
    ViewState["postids"] = System.Guid.NewGuid().ToString();
    Cache["postid"] = ViewState["postids"].ToString();
}
else{
    if (ViewState["postids"].ToString() != Cache["postid"].ToString()){
        IsPageRefresh = true;
    }
    Cache["postid"] = System.Guid.NewGuid().ToString();
    ViewState["postids"] = Cache["postid"].ToString();
}

Как решить эту проблему?


person Srikanth    schedule 03.08.2012    source источник
comment
Кто-нибудь из ответов решил вашу проблему?   -  person lathomas64    schedule 11.02.2015


Ответы (6)


использование состояния просмотра сработало для меня намного лучше, как подробно описано здесь. В основном:

bool IsPageRefresh = false;

//this section of code checks if the page postback is due to genuine submit by user or by pressing "refresh"
if (!IsPostBack)     
{
    ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
    Session["SessionId"] = ViewState["ViewStateId"].ToString();
}
else
{
    if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
    {
        IsPageRefresh = true;
    }

    Session["SessionId"] = System.Guid.NewGuid().ToString();
    ViewState["ViewStateId"] = Session["SessionId"].ToString();
}   
person lathomas64    schedule 26.09.2013
comment
Это не работает для меня. Я думаю, это потому, что я пытаюсь обнаружить обновление после начальной загрузки страницы, а не после постбэка, поэтому isPostback всегда ложно! У вас есть идея, как изменить код, чтобы работало обновление после первоначальной загрузки страницы? - person Dov Miller; 03.10.2017
comment
Для тех, кто приходит сюда, просматривая этот ответ: вам нужно будет установить новое значение для состояния просмотра или сеанса в обработчике обратной передачи, чтобы два значения были разными и уловили обновление. - person MetalPhoenix; 30.05.2019

Эта статья может быть вам полезна http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

вы добавляете Guid в свое состояние просмотра, чтобы однозначно идентифицировать каждую страницу. Этот механизм отлично работает, когда вы находитесь в самом классе Page. Если вам нужно идентифицировать запросы до того, как вы достигнете обработчика страницы, вам нужно использовать другой механизм (поскольку состояние просмотра еще не восстановлено).

Событие Page.LoadComplete — разумное место, чтобы проверить, связан ли Guid со страницей, и если нет, создать его.

проверьте этот http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html

person Vinoth    schedule 03.08.2012
comment
Я только что отредактировал свой вопрос. У вас есть решение проблемы? - person Srikanth; 03.08.2012

Простое решение

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

    protected void Page_Load(object sender, EventArgs e)
    {
        var id = "IsPageRefresh";
        if (IsPostBack && (Guid)ViewState[id] != (Guid)Session[id]) Response.Redirect(HttpContext.Current.Request.Url.AbsolutePath);
        Session[id] = ViewState[id] = Guid.NewGuid();

        // do something

     }
person Roberto    schedule 04.10.2019

Это отлично сработало для меня.

bool isPageRefreshed = false;

protected void Page_Load(object sender, EventArgs args)
{
    if (!IsPostBack)
    {
        ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
        Session["SessionId"] = ViewState["ViewStateId"].ToString();
    }
    else
    {
        if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
        {
            isPageRefreshed = true;
        }

        Session["SessionId"] = System.Guid.NewGuid().ToString();
        ViewState["ViewStateId"] = Session["SessionId"].ToString();
    } 
}
person Rohan    schedule 30.11.2020

Если вы хотите обнаружить обновление в HTTP GET, а не только в POST, вот хакерский обходной путь, который в современных браузерах в основном работает.

Javascript:

window.onload = function () {
    // regex for finding "loaded" query string parameter
    var qsRegex = /^(\?|.+&)loaded=\d/ig;
    if (!qsRegex.test(location.search)) {
        var loc = window.location.href + (window.location.search.length ? '&' : '?') + 'loaded=1';
        window.history.replaceState(null, document.title, loc);
    }
};

C#:

public bool IsPageRefresh 
{
    get
    {
        return !string.IsNullOrEmpty(Request.QueryString["loaded"]);
    }
}

Когда страница загружается, она добавляет параметр QueryString loaded=1 без перезагрузки страницы (опять же, это --window.history.replaceState--работает только в постархаичные браузеры). Затем, когда пользователь обновляет страницу, сервер может проверить наличие параметра loaded в строке запроса.

Предостережение: в основном работает

Это не работает, когда пользователь щелкает адресную строку и нажимает enter. То есть сервер выдаст ложноположительный результат, обнаружив обновление, когда, скорее всего, пользователь действительно намеревался перезагрузить страницу заново.

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

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

  • SessionState (при условии, что SessionState включен) и значение параметра loaded QueryString
  • прослушиватель событий window.onbeforeunload
  • события клавиатуры (обнаружение F5 и Ctrl + R для быстрого изменения URL-адреса обратно на удаление параметра loaded QueryString — хотя это может привести к ложноотрицательному результату при нажатии кнопки обновления браузера кнопка)
  • печенье

Если кто-то предложит решение, буду рад услышать.

person dx_over_dt    schedule 07.09.2015

Еще один способ проверить обновление страницы. Я написал собственный код без java-скрипта или какой-либо клиентской части.

Не уверен, что это лучший способ, но я чувствую себя хорошо.

protected void Page_Load(object sender, EventArgs e)
    {
        if ((Boolean)Session["CheckRefresh"] is true)
        {
            Session["CheckRefresh"] = null;
            Response.Write("Page was refreshed");
        }
        else
        { }
    }
    protected void Page_PreInit(object sender, EventArgs e)
    {
        Session["CheckRefresh"] = Session["CheckRefresh"] is null ? false : true;
    }
person Narender Kumar    schedule 11.06.2018