本人自定义一套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()。但整个页面程序终止了。望高手指点,或者有其他方法解决我目前用户界面的需求吗?谢谢。
解决方案 »
- asp.net操作treeview控件的javascript脚本[net2008版]
- 有关GridView的Command疑问。
- 一个Regex.Split 正则,如何排除一个特殊情况?
- 母版页加载时,不能使用Panel的Visible属性...
- 关于datagrid表的二次查询
- vs2003自带的那个示例与快速入门教程的数据库怎么安装上去?比较急,各位帮忙了,解决立即给分!
- 一个异步调用的问题
- 一张商品表和一张评论表,当显示一个商品的信息时,同样显示出该商品相应的所有评论,该怎么做?
- 选中省之后,如何让市与之对应。如图
- 有没有免费下载vs.net的地方呀,
- 如和实现treeview在前台的TreeNodeExpanded事件?
- |M| 如何将一个Stream 转换成 Byte[] 谢谢
我焦点在如何基类构造函数
调用
string str = " <script language='javascript' defer> ShowLogonPage(); </script> ";
if (!this.IsStartupScriptRegistered("ExeScript"))
this.RegisterStartupScript("ExeScript", scriptString);
之后不去运行子类的代码?你们说的不是我问题重点所在,我用Response.Write只是做个测试。
谢谢2位。
如何在Page_Load中终止页面控件其他代码的运行?
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;
}
if(!CheckUser())
Return; 。
还有其他方法吗?
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); //递归,访问该控件的下属控件集。
}
}
你的方法我未试过,但是估计行不通,因为你的方法是判断没有权限之后偏历页面控件,然后设置对应脚本。
但在本次,也就是判断的当前,控件的方法还是会执行(之后再产生对应脚本输出到客户端),只有在下次执行控件的时候才
会return false 有效,而我的要求是在用户触发控件之后,本次就必须可以终止控件运行的代码。我以前的做法是因为在basepage就直接跳转到其他页,所以回避了这个问题,但是现在要求客户体验改进,而且已经是成型的系统,不能太大改动(否则我就完全用ajax来实现了,现在是ajax+部分web控件)其实我想到几个思路来解决问题,不知道大家有什么意见1:用异常中断 仍出自定义exception,应该可以达到中断后续代码的效果。
2:屏蔽对应提交控件的事件方法,
例如:
btton.click -= new system ***(this.btton.click()); 屏蔽了该控件的事件方法。
但是不知道怎么获取对上请求的控件ID,而且请求不一定就是button控件,可能是GridView里面的控件。
也不知道如何偏历整个页面,获取全部事件(在vs2003可以,到vs2005就封装到其他地方了,郁闷)。
但是不知道怎么获取对上请求的控件ID,而且请求不一定就是button控件,可能是GridView里面的控件。-------void button_Click(object sender,Event args)
{
Button btn=(Button)sender;
btn.ID //获取ID
}
http://topic.csdn.net/u/20071226/13/ebde04a4-615e-4766-b48a-05fa6bac07ec.html
[100分不够再加有详尽的源码]