Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取ASP.NET页生命周期的状态_Asp.net_Page Lifecycle - Fatal编程技术网

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

获取ASP.NET页生命周期的状态,asp.net,page-lifecycle,Asp.net,Page Lifecycle,我的方法中需要以下功能:如果在ASP.NET生命周期的OnLoad事件之前调用该方法,则抛出异常,否则继续执行该方法 我在想这样的事情: if (Page.LifeCycleState < LifeCycleState.OnLoad) { throw new InvalidPageStateException(); } if(Page.LifeCycleState

我的方法中需要以下功能:如果在ASP.NET生命周期的
OnLoad
事件之前调用该方法,则抛出异常,否则继续执行该方法

我在想这样的事情:

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

是否可以检索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;
    }
}
如果希望从页面外部的代码(如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();
        }
    }
}

通过查看当前
HttpContext

CurrentHandler
PreviousHandler
属性,您可能能够找到您要查找的内容。System.Web.UI.Control class()的实现中有一个属性:

其中ControlState是包含以下成员的枚举:Initialized、ViewStateLoaded、Loaded等

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

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

目前还不清楚Onload事件是什么意思,也不清楚“方法”位于何处。是页面的加载还是控件的加载?它是页面的“方法”还是控件的“方法”

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

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

在“方法”中:


我不知道asp.net页面是否有内置的状态指示器。但是,您也可以使用状态属性创建名为“LifeCycleState”的枚举,并在页面上放置一个变量以保持此枚举类型的状态,通过捕捉页面上的事件(如onload)来设置currentstate值……是的,如果没有这样的内置功能,这就是我所想的。记住YAGNI(你不会需要它)。只开发您肯定需要的功能。如果您只关心是否已到达一个页面事件,那么在整个页面生命周期中维护状态是没有意义的。否则,您将增加测试量和潜在的bug。一旦考虑到用户控件、MistPage和控件事件,页面生命周期就变得复杂。在写出这样的一个枚举之前,请考虑这个问题。在这种特殊情况下,我需要检测整个应用程序是否达到了不同的页面状态。上面的例子只是简化了我的需求。在这种情况下,枚举是个好主意。用它代替我答案中的bool属性。确保你对生命周期有充分的了解。在这页的中间有一个很好的图表:我需要关于页面状态的信息。我不知道如何从HttpContext中检索它。这是在Spring.NET中。我要求原始ASP.NET解决方案。无论如何,谢谢。我的代码示例是原始ASP.NET代码。获得控制状态的唯一方法是Daniel Dyson提出的。
    internal ControlState ControlState { 
        get { return _controlState; }
        set { _controlState = value; } 
    } 
Context.Items[UniqueID] = this;
if (Context.Items[UniqueID] != null) 
{
    throw new InvalidPageStateException();
}