我尝试写了一个分层架构的.NET Web应用程序。
我要做的是用户登录后,通知页面更改显示状态。
我定义了一个类:SystemManager处理相关业务,它有一个事件: public event System.EventHandler AfterLoginEvent;当登录操作完成后就触发这个事件。
我在页面类(_Default)中加入了一个方法: On_AfterLogin,并将它注册到了SystemManager的AfterLoginEvent事件,如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
((SystemManager)Session["Manager"]).AfterLoginEvent += new EventHandler(this.On_AfterLogin);
} } public void On_AfterLogin(Object sender,EventArgs e)
{
TextBox1.Text += "You have Logined,"+((User)Session["User"]).UserName;
}我在单步调试时看到,程序会按照我预想的顺序执行,但最后页面显示的TextBox没有作相应改动。由于我对Page组件的运行流程没有足够的认识,所以判断不出问题所在,猜想可能是执行On_AfterLogin是在Page_Load之后,所以不能更新页面。请高手指点!
我要做的是用户登录后,通知页面更改显示状态。
我定义了一个类:SystemManager处理相关业务,它有一个事件: public event System.EventHandler AfterLoginEvent;当登录操作完成后就触发这个事件。
我在页面类(_Default)中加入了一个方法: On_AfterLogin,并将它注册到了SystemManager的AfterLoginEvent事件,如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
((SystemManager)Session["Manager"]).AfterLoginEvent += new EventHandler(this.On_AfterLogin);
} } public void On_AfterLogin(Object sender,EventArgs e)
{
TextBox1.Text += "You have Logined,"+((User)Session["User"]).UserName;
}我在单步调试时看到,程序会按照我预想的顺序执行,但最后页面显示的TextBox没有作相应改动。由于我对Page组件的运行流程没有足够的认识,所以判断不出问题所在,猜想可能是执行On_AfterLogin是在Page_Load之后,所以不能更新页面。请高手指点!
还是对ASP.NET的理解不够深入
问题出在:
if (!this.IsPostBack)
{
((SystemManager)Session["Manager"]).AfterLoginEvent += new EventHandler(this.On_AfterLogin);
}
由于每次请求都会生成新的页面对象,而这里的方法注册是将第一次生成的Page对象的On_AfterLogin方法注册给了((SystemManager)Session["Manager"]).AfterLoginEvent。所以对于后来的Page对象,实际并未订阅AfterLoginEvent事件。
将 if (!this.IsPostBack) 限定去掉即可。补充有分!
非常欣赏这样的客观态度。如果了解asp.net,不必谦虚。不了解asp.net,但是自己也明白问题出在哪里,钦佩。
你可以跟踪this的HashCode,看看执行时是不是最近一个page_load中的this的HashCode。如果是同一个,并且On_AfterLogin在Render方法之前执行,那么对TextBox的修改就可以在当前page的输出中体现。否则,这两个条件有一个不符合,都不能在当前page的输出中看到你要看到的文本。
{
TextBox1.Text += "You have Logined,"+((User)Session["User"]).UserName; }
}
{
if((User)Session["User"]).Loged)
TextBox1.Text += "You have Logined,"+((User)Session["User"]).UserName;
}
不过虽然你的代码错了,我其实很欣赏你的设计初衷。业务逻辑可能Notify给界面组件,很好的思路。只是只有page生命期中间的这种通知才需要。如果你了解很多UI与后台对象交互设计的好的框架,可以在asp.net中很多其它方面进行架构。例如asp.net编程中有很多“事件”代码,如果这些代码可以删除,变为在aspx或者ascx上由(美工)设计人员用xhtm声明各个控件以及与后台对象的属性绑定,就能将程序变得很干净、稳定。asp.net提供了一些数据绑定控件,但是要想彻底删除手工编码,还需要程序员开发一些紧密集合业务的数据绑定控件。如果开发复杂的页面(包扩使用到asp.net ajax的页面),不需要在页面的code-behind中写代码,或者急需要很少的十几行代码,这样的系统才是高效率的。而实现这样的东西(大量的依赖倒置设计)就需要你设计的背景。asp.net程序员许多不懂asp.net以外的其它开发工具的架构,因此对asp.net自身的业务中间件也不会开发,只会重复很简单的一些范例代码。
这个“三层架构”是我想象着写出来的,后来又读了一些文章,发现自己的认识过于肤浅了。
我是大三学生,接触.NET刚一年,现在正尝试着能够对它有更深入和系统的认识。
下一步我会去下载您说的reflector,认真研究asp.net架构。
再次感谢!