系统.网状物Ui.可以扩展页面事件的页面派生类

本文关键字:事件 派生 扩展 网状物 Ui 系统 | 更新日期: 2023-09-27 18:00:59

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

我曾想过使用分部方法,但我认为我做不到,因为页面事件在System中不是分部。网状物Ui。佩奇,对吧?

顺便说一下,我的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;
   }
}

系统.网状物Ui.可以扩展页面事件的页面派生类

更好的解决方案可能是覆盖基类中的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;
   }
}

我建议您将IsSecure属性设置为抽象(只读(,并让派生页面实现它。确定属性值的逻辑包含在属性的getter中。

BasePage:中

protected abstract bool IsSecure { get; }

_Default等中:

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

为什么不在Constructor中设置您的IsSecure?

定义如下:

public _Default()
{
 IsSecure = true;
}

您的代码很好,如果您想扩展PageInit,只需重写并调用派生类中的基即可。

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