Определить обновление браузера - PullRequest
5 голосов
/ 07 июля 2011

Как я могу узнать, нажал ли пользователь клавишу 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!
}

Ответы [ 2 ]

4 голосов
/ 09 июля 2014

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

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();
    } 
}
1 голос
/ 07 июля 2011

Единственное верное решение - сделать перенаправлением на ту же страницу , и вот аналогичный вопрос: 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

...