Почему Page_Load не запускается после возвращения с другой страницы с помощью ASP.NET - эрго эпическое смущение:)

Допустим, у меня есть две страницы на одном веб-сайте ASP.NET C#.

  • Page1.aspx работает в событии Page_Load
  • Я перехожу к Page2.aspx с помощью меню
  • Page2.aspx делает некоторые вещи, а затем Response.Redirect обратно на Page1.aspx
  • В этот раз Page1.aspx не может что-то делать в событии Page_Load, потому что он никогда не срабатывает.

Я пытался декларативно отключить кеш, пытался использовать true для endResponse в моем перенаправлении... ничего не изменилось.

Не бери в голову всех! Я дебил! Используя Visual Studio Dev Localhost, Redirect перенаправлял на живую страницу! :)

7 ответов

Решение

Причина выполнения страницы не влияет на цикл страницы, событие Load всегда срабатывает при выполнении страницы.

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

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

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Это предотвратит кеширование страницы в обычных условиях. (Проверьте также, что ваш браузер не находится в автономном режиме, тогда он будет использовать что-либо в кэше независимо от настроек кеширования.)

При переходе на страницу с помощью кнопки "Назад" страница перезагружается из памяти, и на сервер не отправляется запрос.

Вы можете подтвердить это с помощью Fiddler.

Я не уверен, правда ли это во всех браузерах.

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

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

Попробуйте использовать Server.Transfer вместо Response.Redirect.

Клиент не увидит изменения URL, но это может не иметь значения, в зависимости от ваших требований

Смена VS с режима отладки на Release работала для меня....

Пожалуйста, запустите следующий код, чтобы отключить кеш страниц в Firefox.

Response.AppendHeader("Cache-Control", "no-store");

Примените это в загрузке страницы главной страницы.

У меня была та же проблема, и я обнаружил, что это работает для меня: (добавьте это в раздел Page_Load)

    if (this.Master.Page.Header != null && Session["RELOAD"] == null)
    {
        System.Web.UI.HtmlControls.HtmlHead hh = this.Master.Page.Header;
        System.Web.UI.HtmlControls.HtmlMeta hm = new System.Web.UI.HtmlControls.HtmlMeta();
        hm.Attributes.Add("http-equiv", "Refresh");
        hm.Attributes.Add("content", "3");
        hh.Controls.Add(hm);
    }

и затем я добавляю Session["RELOAD"] = "1" сразу после того, как он выполняет код, который я хочу запустить, чтобы он не обновлялся снова и снова. Работает как шарм.

Другие вопросы по тегам