2010-08-25 2 views
4

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

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

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

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

+1

я не знаю, если есть встроенный индикатор состояния для страниц asp.net .. но альтернативно вы можете создать перечисление с именем «LifeCycleState» с полномочиями штата и поместить переменную для хранения состояния с этим типом перечисления на странице и путем поиска событий на странице, например onload, oninit вы можете установить значение currentstate .... – dankyy1

+0

Да, это то, что я был думая о том, нет ли такой встроенной функциональности. –

+1

Помните YAGNI (вам это не понадобится). Только разработайте функциональность, которая вам определенно понадобится.Нет смысла поддерживать право штата через жизненный цикл страницы, если вас интересует только то, достигнуто ли одно событие страницы. В противном случае вы увеличите количество тестов и потенциальных ошибок. Жизненный цикл страницы сложный, когда вы рассматриваете пользовательские элементы управления, MasterPages и управляющие события. Пожалуйста, подумайте об этом, прежде чем писать такое перечисление. –

ответ

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

Спасибо @abatishchev –

0

Вы, может быть в состоянии найти то, что вы ищете, глядя на CurrentHandler и PreviousHandler свойств текущего HttpContext.

+0

Мне нужна информация о состоянии страницы. Я не понимаю, как получить его из HttpContext. –

1

Существует собственность в реализации класса System.Web.UI.Control (realization):

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

Где ControlState этом перечисление, который содержит элементы, такие как: инициализировано, ViewStateLoaded, Загруженные т.д. here declaration

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

+0

Ну, это в Spring.NET. Я попросил сырое решение ASP.NET. Спасибо, в любом случае. –

+0

Мои примеры кода представляют собой необработанный код ASP.NET. Даниэль Дайсон предлагает только способ получить контроль над состоянием. – chapluck

0

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

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

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

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

Context.Items[UniqueID] = this; 

В «методе»:

if (Context.Items[UniqueID] != null) 
{ 
    throw new InvalidPageStateException(); 
} 
Смежные вопросы