获取ASP.NET页生命周期的状态
我的方法中需要以下功能:如果在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
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();
}