当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

获取ASP.NET页生命周期的状态

admin 88℃
我需要在我的方法中使用以下功能:如果之前调用了该方法 OnLoad ASP.NET生命周期的事件引发异常,否则继续执行该方法。

我在想这样的事情:

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

是否可以检索ASP.NET页生命周期的状态?

一种方法是使用一个在站点中始终使用的基本页。这将包含一个名为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;
    }
}

如果要从页面外部的代码(如用户控件)访问变量,则必须将其公开并将页面强制转换为基页。

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

system.web.ui.control类的实现中有属性(realization):

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

其中controlstate是枚举,它包含以下成员:initialized、viewstateloaded、loaded等。here declaration

但正如你所看到的,这个属性是内部的。所以获得控制状态的唯一方法是由daniel dyson提出的。

你也许可以通过查看 CurrentHandlerPreviousHandler 电流特性 HttpContext .

如果在ASP.NET生命周期的onload事件之前调用该方法 抛出异常,否则继续执行该方法。

目前尚不清楚onload事件的含义,也不清楚'方法'位于何处。是页面加载还是控件加载?是页面的'方法'还是控件的'方法'?

无论如何,可以在Context.items字典中存储某种标志,所有控件(包括页)在请求期间都可以访问该字典。这样就不需要像建议的obove那样使用一般的基页。

在onload方法中(无论是页面的onload还是控件的onload):

Context.Items[UniqueID] = this;

在'方法'中:

if (Context.Items[UniqueID] != null) 
{
    throw new InvalidPageStateException();
}

转载请注明:我的代码 » 获取ASP.NET页生命周期的状态