Получить состояние жизненного цикла страницы ASP.NET

Мне нужна следующая функциональность в моем методе: если метод вызывается до OnLoad события жизненного цикла ASP.NET, выдать исключение, иначе продолжить выполнение метода.

Я думал о чем-то вроде этого:

if (Page.LifeCycleState < LifeCycleState.OnLoad) {
    throw new InvalidPageStateException();
}

Можно ли получить состояние жизненного цикла страницы ASP.NET?


person Petr Kozelek    schedule 25.08.2010    source источник
comment
я не знаю, есть ли встроенный индикатор состояния для страниц asp.net. перехватывая события на странице, такие как onload, oninit, вы можете установить значение currentstate....   -  person dankyy1    schedule 25.08.2010
comment
Да, именно об этом я и думал, если нет такого встроенного функционала.   -  person Petr Kozelek    schedule 25.08.2010
comment
Помните YAGNI (он вам не понадобится). Разрабатывайте только тот функционал, который вам точно понадобится. Нет смысла поддерживать состояние на протяжении всего жизненного цикла страницы, если вас интересует только то, было ли достигнуто одно событие страницы. В противном случае вы увеличите объем тестирования и количество ошибок. Жизненный цикл страницы усложняется, если учесть пользовательские элементы управления, эталонные страницы и события элементов управления. Пожалуйста, учтите это, прежде чем писать такое перечисление.   -  person Daniel Dyson    schedule 25.08.2010
comment
Правда правда. В этом конкретном случае мне нужно обнаружить, что во всем приложении были достигнуты разные состояния страницы. Приведенный выше пример был просто упрощением моих потребностей.   -  person Petr Kozelek    schedule 25.08.2010
comment
В этом случае перечисление является хорошей идеей. Просто используйте его вместо свойства bool в моем ответе. Убедитесь, что у вас есть полное представление о жизненном цикле. В середине этой страницы есть хорошая диаграмма: msdn.microsoft.com/en -us/library/ms178472.aspx   -  person Daniel Dyson    schedule 25.08.2010


Ответы (4)


Одним из подходов может быть использование базовой страницы, которую вы всегда используете на своем сайте. Это будет содержать переменную с именем PageLoadComplete, которую вы должны установить в конце вашего события PageLoad. Затем вы можете проверить состояние этой переменной из своего метода.

public abstract class BasePage : System.Web.UI.Page
{
    public bool PageLoadComplete { get; private set; }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        PageLoadComplete = true;
    }
}

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

public partial class MyUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        BasePage basePage = this.Page as BasePage;
        if (basePage != null && !basePage.PageLoadComplete)
        {
            throw new InvalidPageStateException();
        }
    }
}
person Daniel Dyson    schedule 25.08.2010

В реализации класса System.Web.UI.Control(реализация):

    internal ControlState ControlState { 
        get { return _controlState; }
        set { _controlState = value; } 
    } 

Где ControlState — это перечисление, содержащее такие элементы, как Initialized, ViewStateLoaded, Loaded и т. д. здесь объявление

Но, как видите, это свойство является внутренним. Так что единственный способ получить состояние управления предложен Дэниелом Дайсоном.

person chapluck    schedule 25.08.2010
comment
Ну, это в Spring.NET. Я попросил сырое решение ASP.NET. Спасибо, в любом случае. - person Petr Kozelek; 25.08.2010
comment
Мои примеры кода представляют собой необработанный код ASP.NET. И единственный способ получить состояние управления предложен Дэниелом Дайсоном. - person chapluck; 26.08.2010

Возможно, вы сможете найти то, что ищете, просмотрев свойства CurrentHandler и PreviousHandler текущего HttpContext.

person leppie    schedule 25.08.2010
comment
Мне нужна информация о состоянии страницы. Я не понимаю, как получить его из HttpContext. - person Petr Kozelek; 25.08.2010

если метод вызывается до события OnLoad жизненного цикла ASP.NET, генерируется исключение, в противном случае продолжается выполнение метода.

Неясно, какое событие Onload имеется в виду и где находится «метод». Это загрузка страницы или загрузка элемента управления? Это «метод» страницы или «метод» элемента управления?

В любом случае, в Context.Items Dictionary можно хранить своего рода флаг, к которому все элементы управления (включая Page) имеют доступ во время запроса. Это избавляет от необходимости использовать общую базовую страницу, как предложено выше.

В методе OnLoad (независимо от того, является ли это OnLoad страницы или OnLoad элемента управления):

Context.Items[UniqueID] = this;

В «методе»:

if (Context.Items[UniqueID] != null) 
{
    throw new InvalidPageStateException();
}
person Don P    schedule 10.06.2014