我创建了一个继承自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;
}
}
答案 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
}
}