Нет Page_PreLoad на главной странице? - PullRequest
4 голосов
/ 22 февраля 2011

У меня есть пользовательский объект в сеансе, который обновляется с помощью обратных ссылок как на главной, так и на главной странице.

После обратной передачи мне нужно получить объект Session, перестроить и изменить его части или весь объект и загрузить его обратно в Session.

Я написал этот код в Page_Load главной страницы. Отлично работает только на одной странице.

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

Так что я подумал, что мне просто нужно переместить код обработки сеанса в Page_Load главной страницы. Но это не сработало, как я ожидал, так как элемент управления на главной странице (а именно повторитель) обращается к объекту сеанса в обработчике события OnItemDataBound, ДО запускается страница Page_Load главной страницы, и таким образом он получает только предыдущее состояние объекта сеанса. , (Это верно только для повторителя на главной странице, повторитель на главной странице получает текущее состояние при обращении к сеансу)

Независимо от того, что я думал, что смогу использовать событие Page_PreLoad главной страницы, я мог бы получить доступ к данным обратной передачи в Page_PreLoad так же хорошо и соответствующим образом обновить объект сеанса, но я обнаружил, что на главной странице НЕТ Page_PreLoad, или Я не могу его использовать.

Где мне обновить свой объект в сеансе?

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

Ответы [ 4 ]

4 голосов
/ 22 февраля 2011

Надеюсь, я правильно понимаю - думаю, ваш лучший вариант - создать базовую страницу и сделать так, чтобы ваши страницы унаследовали это.Поместите свою логику в обработчик событий Page_Load или Page_PreLoad на базовой странице.Главные страницы загружаются после того, как фактическая страница начинает загружаться.

Итак, вы создаете базовую страницу:

public class BasePage : Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      // sesion logic here
   }  
}

И делаете свою страницу наследственной от этого (а также используя свою главную страницу)):

public class Page1 : BasePage //instead of Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      base.Page_Load(sender, e);
   }  
}
3 голосов
/ 10 ноября 2014

Существует также другое решение: в событии init главной страницы вы можете подписаться на событие предварительной загрузки страницы. рассмотрите этот код на главной странице:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        Page.PreLoad += OnPreLoad;
    }

    protected void OnPreLoad(object sender, EventArgs e)
    {
        //this function is in the masterpage but will be called on page preload event so do here your preload stuff ...
    }
2 голосов
/ 14 ноября 2012

Из форумов asp.net :

Мастер "страницы" являются UserControl, размещенными фактическимPage.Это означает, что они проходят только жизненный цикл control , а не жизненный цикл page .

Как и предполагалось, лучшим подходом является базовый Pageкласс, так что вы можете иметь общий код, разделяемый между страницами.Другой способ - использовать одно из событий Request, поддерживаемых классом Application.

В итоге я просто использовал событие Init(поскольку событие PreLoad отсутствует):

protected void Page_Init(object sender, EventArgs e)
{
   if (Request.Params["debug"] != null)
      Page.Trace.IsEnabled = true;
}
1 голос
/ 04 августа 2014

вы также можете переопределить предварительную загрузку, если вы ищете это:

public class BasePage : System.Web.UI.Page
{
    public BasePage()
    {
    }
    protected override void OnPreInit(EventArgs e)
    {
        MasterPageFile = "MasterPage2.master";

    }  
}
...