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