朋友,困扰我3天的问题。急死了。本人自定义一套web页面基类,用于检验用户是否登录设置 public   class   BasePage   :   System.Web.UI.Page 

        public   BasePage():   base() 
        { 
                //判断登录是否超时 
                this.Load   +=   new   EventHandler(this.PageInitAction); 
        }         ///   <summary> 
        ///   判断登录是否超时 
        ///   </summary> 
        ///   <param   name="sender"> </param> 
        ///   <param   name="e"> </param> 
        private   void   PageInitAction(object   sender,   EventArgs   e) 
        { 
                
                //检查登录是否失效 
                if   (Session["userLogOnInfo"]   ==   null)   
                { 
                        string   str   =   " <script> window.location.href='default.aspx';alert('您未登录或登录已失效,该操作必须登录!'); </script> "; 
                        Response.Write(str);                 }         } 
} 功能是验证用户登录对象是否存在,不存在就跳转当前页面。 现在新的需求希望可以增加用户界面友好程度,使用弹出层(div)的形式显示登录界面, 
效果是用户登录失效之后页面不直接跳转,使用div+css弹出一个登录层,让用户感觉不到变化(使用了部分axaj控件) 功能是实现了,代码如下: 
        ///   <summary> 
        ///   判断登录是否超时 
        ///   </summary> 
        ///   <param   name="sender"> </param> 
        ///   <param   name="e"> </param> 
        private   void   PageInitAction(object   sender,   EventArgs   e) 
        { 
                
                //检查登录是否失效 
                if   (Session["userLogOnInfo"]   ==   null)   
                { 
    
                        string   str   =   " <script   language='javascript'   defer> ShowLogonPage(); </script> "; 
                        if   (!this.IsStartupScriptRegistered("ExeScript")) 
                                this.RegisterStartupScript("ExeScript",   scriptString);                 }         } 
其中ShowLogonPage()是一个封装在js的javascript函数。内部实现原理是动态添加div, 
再在div中添加iframe元素,iframe的src=“default.aspx”; 但目前存在一个问题:就是如何调用了上述 
" <script   language='javascript'   defer> ShowLogonPage(); </script> "; 
代码,弹出了登录输入框之后终止后面的子类代码运行。 例如某个子类 
public   partial   class   TestPage_TestLogon   :   BasePage 

        protected   void   Button1_Click(object   sender,   EventArgs   e) 
        { 
                Response.Write(" <script> alert('感谢'); </script> "); 
        } 
} 在之前的方法,因为是当前页面直接跳转,所以子类的Response.Write(" <script> alert('感谢'); </script> ");这个句不会执行 
但目前方法没有跳转页面,如何能在运行基类ShowLogonPage();之后终止子类的代码运行。 本人尝试过使用response.end()。但整个页面程序终止了。 望高手指点,或者有其他方法解决我目前用户界面的需求吗?谢谢。我曾经考虑过用屏蔽控件事件方法来解决,但是如何偏历一个页面,屏蔽所有控件事件,或者得知对上提交的控件,屏蔽该控件的事件?原贴地址
http://topic.csdn.net/u/20071224/09/c4cdf052-2489-470e-be7b-211ec5c661a7.html万分致谢。

解决方案 »

  1.   

    不太清楚你的意思. 模模糊糊的看出来一点.
    我觉得你可以在 iframe.src里加参数.
    比如iframe src="default.aspx?x=1"default.aspx.cs检测有无x为1的参数, 有则表示是因为未login被别的页面调用来输出login区的,就只处理loginwin, 若无,则是正常运行的.如果有可能,那将整站改为ajax模式. 这样处理会方便很多.不过js的工作量稍大了些,另外,还要处理浏览器的兼容性.http://219.153.19.88:8800/Service.HTML以fcuandy,密码fcuandy login进去,左上方会显示连接保持. 你可以拔掉网线或禁用网卡, 左上方红字显示重连. 接上网线,又会再次连上. 这里字体的改变跟你弹出div的login区一样的道理. 个人觉得,如果是取数据,那么取数据部分可以采用ajax.
    如果是显示部分以ajax来处理,那就全部采用ajax,不然搞得不伦不类的.
      

  2.   

    我觉得是不是应该这样:
    BasePage:
    加一个验证用户函数:
    protected bool CheckUser()
    {
      bool bRet = true;
                                    //检查登录是否失效   
      if       (Session["userLogOnInfo"]       ==       null)       
      {   
            
           string       str       =       "   <script       language='javascript'       defer>   ShowLogonPage();   </script>   ";   
           if       (!this.IsStartupScriptRegistered("ExeScript"))   
                                                                    this.RegisterStartupScript("ExeScript",       scriptString);   
          bRet = false;
      }   
      return bRet;
    }
    派生页面:
    Page_Load(...)
    {
       if(!CheckUser())
          Return;
    }
      

  3.   

    fcuandy:我的问题焦点是2个
    1:如何在basepage的基类构造函数中结束后续代码运行(包括子类页面pageload,和请求发自页面某个控件的内部代码)
    2:如果不能结束后续代码运行,能不加载改页面的控件事件方法。目的也是不去运行控件中的代码。raul_qu
    你的方法只能解决终止pageload的后续代码,但如果该页面的请求发自本页面某个button控件,是不能起到终止后续代码的作用。当然,可以在每个控件都加上
    if(!CheckUser())   
                            Return;   
    来实现功能,但是这样工作量超大。
    有其他方法吗?
      

  4.   

    楼主,为什么要么个button都加???button控件调用它的事件时会先调用pageload啊
      

  5.   

    raul_qu:
    asp.net 页面上任何提交服务期控件的方法必然先调用pageload事件的方法Page_load()
      

  6.   

    raul_qu:
    asp.net   页面上任何提交服务期控件的方法必然先调用pageload事件的方法Page_load()
    但是执行了Page_load()之后
    具体是你给出的
    if(!CheckUser())Return;  
    之后,控件内部代码还是会执行,也就是“if(!CheckUser())Return;”只能终止Page_load()方法的代码,不能终止控件内部代码。
    谢谢。
      

  7.   

    raul_qu:先谢谢你,你在我那个贴子回贴我都给你分。
    你的方法我未试过,但是估计行不通,因为你的方法是判断没有权限之后偏历页面控件,然后设置对应脚本。
    但在本次,也就是判断的当前,控件的方法还是会执行(之后再产生对应脚本输出到客户端),只有在下次执行控件的时候才
    会return false 有效,而我的要求是在用户触发控件之后,本次就必须可以终止控件运行的代码。我以前的做法是因为在basepage就直接跳转到其他页,所以回避了这个问题,但是现在要求客户体验改进,而且已经是成型的系统,不能太大改动(否则我就完全用ajax来实现了,现在是ajax+部分web控件)其实我想到几个思路来解决问题,不知道大家有什么意见1:用异常中断 仍出自定义exception,应该可以达到中断后续代码的效果。
    2:屏蔽对应提交控件的事件方法,
    例如:
    btton.click -= new system ***(this.btton.click()); 屏蔽了该控件的事件方法。
    但是不知道怎么获取对上请求的控件ID,而且请求不一定就是button控件,可能是GridView里面的控件。
    也不知道如何偏历整个页面,获取全部事件(在vs2003可以,到vs2005就封装到其他地方了,郁闷)。