Обнаружить обновление браузера

Как я могу узнать, нажал ли пользователь F5, чтобы обновить мою страницу (Примерно так, как реализовано SO. Если вы обновите свою страницу, счетчик вопросов не увеличивается). Я протестировал множество фрагментов кода, упомянутых в десятке руководств, но ни один из них не работал правильно.

Чтобы быть более ясным, предположим, что у меня есть пустая веб-форма и я хотел бы определить, нажал ли пользователь F5 на стороне клиента (в результате чего обновление не отправляется) или нет.

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

Спасибо.

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

    public class PageBase : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        this.Session["LastViewedPage"] = Request.RawUrl;
    }
}  

и на каждой странице, если мне было интересно узнать, является ли это обновлением:

if (this.Session["LastViewedPage"].ToString() == Request.RawUrl)
{
    // This is a refresh!
}

person Kamyar    schedule 07.07.2011    source источник
comment
вы говорите: «Я могу использовать переменные сеанса», так почему бы просто не сохранить последнюю посещенную страницу?   -  person tomfumb    schedule 07.07.2011
comment
Потому что я должен хранить его на каждой странице. На самом деле, может быть, неплохая идея использовать базовую страницу ...   -  person Kamyar    schedule 07.07.2011


Ответы (2)


Единственное надежное решение - сделать перенаправление на ту же страницу , и вот аналогичный вопрос: Post-Redirect-Get с ASP. NET

Но есть и другие уловки: добавьте билет на страницу и посмотрите, есть ли в нем то же самое или есть изменения, см. Полный пример и код по адресу:

http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET

и еще один:

http://dotnetslackers.com/community/blogs/simoneb/archive/2007/01/06/Using-an-HttpModule-to-detect-page-refresh.aspx

person Aristos    schedule 07.07.2011
comment
Не могли бы вы объяснить перенаправление на ту же страницу? - person Kamyar; 07.07.2011
comment
@kamyar Я использую идею проекта кода с некоторым дополнительным кодом, но не всегда работает ... это сложно. Я знаю, что при перенаправлении теряется много полезных данных сообщения ... Я знаю ... - person Aristos; 07.07.2011
comment
@Kaymyar после поста, и все в порядке, вы делаете Responce.Redirect (Url.RawUrl, true); - person Aristos; 07.07.2011
comment
Похоже, я потерялся в концепции. Response.Redirect куда? в page_load? после какого условия? - person Kamyar; 07.07.2011

Я столкнулся с этой проблемой и использую следующий код. У меня это хорошо работает.

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 David    schedule 09.07.2014