在 (fx)中采用了和 (fx)不同的编译模型在fx中Page_Load事件的挂接是写在CodeBehind的代码中的到了fx采用了partial关键字后估计是编译器自动产生了代码再和codefile中的代码合并
fx的编译模式在大多数情况下效果不错代码文件也变得更简洁了但一旦使用页面继承时问题就出来了
在fx中可以写如下代码
public class BasePage:Page
{
override protected void OnInit(EventArgs e)
{
InitializeComponent();
baseOnInit(e);
}
private void InitializeComponent()
{
thisLoad += new SystemEventHandler(thisMy_Page_Load);
}
protected void My_Page_Load(object sender EventArgs e)
{
// do somthing public
PageLoadEvent(sendere);
}
protected virtual void PageLoadEvent(object sender EventArgs e) { }
}
public class FooPage:BasePage
{
protected void Page_Load(object sender EventArgs e)
{
}
protected override void PageLoadEvent(object sender EventArgs e)
{
// do something here
}
}
在fx中这么写没什么问题FooPage中的Page_Load不会被执行一切都很正常
但在fx中首先我不能自己挂接Page_Load事件了因为编译器接管这事了如果想实现fx中的类似功能只能这么写了
public class BasePage:Page
{
protected void Page_Load(object sender EventArgs e)
{
// do somthing public
PageLoadEvent(sendere);
}
protected virtual void PageLoadEvent(object sender EventArgs e) { }
}
public class FooPage:BasePage
{
protected void Page_Load(object sender EventArgs e)
{
}
protected override void PageLoadEvent(object sender EventArgs e)
{
// do something here
}
}
在的代码中必须写Page_Load这样才会被编译器自动挂接没法自定义了这倒不是什么问题只需遵守的规矩好了但在FooPage中就出问题了在FooPage中一旦写了Page_Load就会覆盖BasePage中的Page_Load而编译器只会发出warning说FooPage中的Page_Load隐藏了BasePage中的Page_Load这样的继承是很危险的子类的设计者很可能在不经意间覆盖了父类的逻辑在这个例子中一旦FooPage中定义了Page_Load那么在PageLoadEvent就不会被执行了(假设FooPage的设计者并不是BasePage的设计者)
有可能在中有选项使得与完全兼容但我试了一下发现不管怎么改只要在代码中有Page_Load编译器铁定会挂接Page_Load事件
解决方法
在其他的方法中进行验证
virtual protected void PageLoadEvent( object sender SystemEventArgs e )
{
}
protected override void OnPreInit( EventArgs e )
{
ValidateSession();
baseOnPreInit( e );
}
/// <summary>
/// 验证用户信息
/// </summary>
public void ValidateSession()
{
//如果后台管理界面超时
if (HttpContextCurrentSession[UserId] == null || stringIsNullOrEmpty(HttpContextCurrentSession[UserId]ToString()))
{
ResponseWrite(<script>alert(登录状态过期请重新登录);topwindowlocation=/admin/loginaspx;</script>);
HttpContextCurrentResponseEnd();
return;
//ResponseRedirect(~/admin/loginaspxtrue);
}
}