System.Web.Ui.Page派生类可以扩展页面事件吗?

时间:2011-06-30 13:51:46

标签: c# asp.net derived-class

我创建了一个继承自System.Web.Ui.Page的BasePage类。在该基类中,我有一个bool属性,用于检查页面是否安全。最初,我将代码放在PreInit事件(基类)中,但在考虑之后,我的派生页面将无法在PreInit之前设置bool值。然后我考虑在dervcied页面的PreInit中设置值并在基类的PageInit中检查该值,但是如果我需要在派生页面中使用PreInit呢?

我考虑使用部分方法,但我认为我不能这样做,因为页面事件不是System.Web.Ui.Page中的部分内容,对吧?

顺便说一句,我的BasePage类是一个抽象类。

这就是我现在所拥有的(我没有对此进行测试,但认为它可能有效):

public abstract partial class BasePage: System.Web.UI.Page
{
   public bool IsSecure { get; set; }

   protected void Page_Init(object sender, EventArgs e)
        {
            if (!IsSecure) return;
            if (PageMaster == null)
                return;
            if (!PageMaster.IsUserLoggedIn)
            {
                HttpContext.Current.Response.Redirect("~/WebForms/LogIn.aspx");
            }
        }  
}


public partial class _Default : BasePage
{
   protected void Page_PreInit(object sender, EventArgs e)
   {
     IsSecure = true;
   }

}

4 个答案:

答案 0 :(得分:2)

更好的解决方案可能是覆盖基类中的OnInit方法。您现在仍然可以处理页面中的init事件,并在事件发生之前执行安全检查。

这样:

public abstract partial class BasePage: System.Web.UI.Page
{
    public bool IsSecure { get; set; }

    protected override void OnInit(EventArgs e)
    {
        if (!IsSecure) return;
        if (PageMaster == null)
            return;
        if (!PageMaster.IsUserLoggedIn)
        {
            HttpContext.Current.Response.Redirect("~/WebForms/LogIn.aspx");
        }

        base.OnInit(e)
    }  
}

public partial class _Default : BasePage
{   
   protected void Page_PreInit(object sender, EventArgs e)
   {
      IsSecure = true;
   }

}

答案 1 :(得分:1)

我建议你制作IsSecure属性摘要(和只读)并让你的派生页面实现它。确定属性值的逻辑包含在属性的getter中。

BasePage

protected abstract bool IsSecure { get; }

_Default等:

protected override bool IsSecure 
{
    get { // return true or false depending on some condition }
}

答案 2 :(得分:0)

为什么不在Constructor设置你的IsSecure,它早在你准备好的时候?

只需将其定义为:

public _Default()
{
 IsSecure = true;
}

答案 3 :(得分:0)

您的代码没问题,如果您希望能够扩展PageInit,只需覆盖并调用派生类中的基础。

public partial class _Default : BasePage
{
    protected override void Page_Init(object sender, EventArgs e)
    {
        base.Page_Init(sender, e);
        //more code here
    }
}