本人自定义一套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()。但整个页面程序终止了。望高手指点,或者有其他方法解决我目前用户界面的需求吗?谢谢。

解决方案 »

  1.   

    不能用Response.Write,这是ASP.NET中应该绝对禁止使用的指令。要注册脚本,请使用ScriptManager.RegisterClientScript(如果你使用了ASP.NET AJAX的话),或者Page.RegisterClientScript。
      

  2.   

    用Page.RegisterClientScript别用Response.Write(" <script> alert('感谢'); </script> "); Response.write输出的总会在你生成的html最顶端
      

  3.   

    楼上的2位,我知道应该Response.Write不建议使用,但是那个只是测试,我之后的程序都是RegisterStartupScript
    我焦点在如何基类构造函数
    调用
     string   str   =   " <script   language='javascript'   defer> ShowLogonPage(); </script> "; 
                            if   (!this.IsStartupScriptRegistered("ExeScript")) 
                                    this.RegisterStartupScript("ExeScript",   scriptString); 
    之后不去运行子类的代码?你们说的不是我问题重点所在,我用Response.Write只是做个测试。
    谢谢2位。
      

  4.   

    我把这个问题简化 
    如何在Page_Load中终止页面控件其他代码的运行?
      

  5.   


    BasePage: 
    加一个验证用户函数: 
    protected   bool   CheckUser() 

        bool   bRet   =   true; 
                                                                    //检查登录是否失效       
        if               (Session["userLogOnInfo"]               ==               null)               
        {       
                    
                  string               str               =               "       <script               language='javascript'               defer>       ShowLogonPage();       </script>       ";       
                  if               (!this.IsStartupScriptRegistered("ExeScript"))       
                                                                                                                                    RegisterClientScript("ExeScript",               scriptString);       
                bRet   =   false; 
        }       
        return   bRet; 

    派生页面: 
    Page_Load(...) 

          if(!CheckUser()) 
                Return; 
    }
      

  6.   

    楼上的,这样可以在pageload中终止后面代码,但如果在button控件中提交的情况,这样在完成了pageload的代码之后,控件的代码还是会执行。我的目的是可以同时终止控件的代码。要严重调用可能是很多个控件,不能在每个控件,开始都加上你的
    if(!CheckUser()) 
                Return; 。
    还有其他方法吗?
      

  7.   

    Response.End(),我在帖子中已经说过回终止请求,导致输入一片空白。
      

  8.   

    我都不知道该在你的哪个帖子上回答了~~~~可不可以这样(如果验证失败,遍历button,给它们的onclick增加return false;):
    Page_Load(...)
    {
    ...
      if(!CheckUser())
      {
         AlertAllButtonCommit(this);
         Return;   
      }
    ...
    }
    基类页面中:
    //客户端脚本
    <script language=javascript>
      function Alert(){return false;}
    </script>
    //服务端脚本
        public virtual void AlertAllButtonCommit(Control parent)
        {
          foreach (Control c in parent.Controls)
          {
            if (c.GetType().ToString().Equals("System.Web.UI.WebControls.Button"))
                c.Attributes.Add("onclick","javascript:Alert();"); 
          
            if (c.Controls.Count > 0)       // 判断该控件是否有下属控件。
              AlertAllButtonCommit(c);    //递归,访问该控件的下属控件集。
          }
        }
      

  9.   

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

  10.   

    btton.click   -=   new   system   ***(this.btton.click());   屏蔽了该控件的事件方法。 
    但是不知道怎么获取对上请求的控件ID,而且请求不一定就是button控件,可能是GridView里面的控件。-------void button_Click(object sender,Event args)
    {
       Button btn=(Button)sender;
       btn.ID  //获取ID
    }
      

  11.   

    ,大家也同时看看我的问题,高分相赠
    http://topic.csdn.net/u/20071226/13/ebde04a4-615e-4766-b48a-05fa6bac07ec.html
    [100分不够再加有详尽的源码]
      

  12.   

    不base也可以啊  娘咧  又坑爹