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

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

Я попробовал приведенный ниже код, чтобы решить эту проблему. Фактически, я добавляю визуальный веб-сайт на странице SharePoint. Добавление webpart - это событие обратной записи, поэтому 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();
}

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

Ответ 1

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

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();
}   

Ответ 2

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

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

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

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

Ответ 3

Если вы хотите обнаружить обновление 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);
    }
};

С#:

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

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

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

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

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

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

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

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

Ответ 4

Еще один способ проверить обновление страницы. Я написал собственный код без 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;
    }

Ответ 5

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

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

    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

     }