2011-07-27 52 views
1

我有一个由PageBase类调用的安全类(所有页面都将继承),它将用户重定向到主页或登录页面(取决于它们是否已登录或者不),如果他们尝试访问他们未被授权查看的页面。我想要说的东西一样,以提醒该用户,Page_Init上的提示信息

"You are not authorized to view this page, redirecting you"

或类似的东西。我知道你可以从代码隐藏中调用JavaScript来向用户显示警报。在我的PageBase类中(同样,所有页面都将继承),有一个共同的Page_Init(..)方法,当我尝试从那里调用我的js警报时,什么都不会发生。我在代码中添加了断点,代码正在被打中,但用户没有收到警报。我认为这是因为Page_Init在页面的生命周期中执行js太早,而这正是导致此问题的原因。

有没有办法解决这个问题,而不必为每个单独的页面添加一个函数?此外,这里有两种方法我都试过:

System.Web.UI.Page page = HttpContext.Current.CurrentHandler as System.Web.UI.Page; 
System.Web.UI.ScriptManager.RegisterStartupScript(page, page.GetType(), "alert", "alert('You do not have access to this page. You are being redirected')", true); 

Response.Write("<script type='text/javascript'>alert('You do not have access to this page. You are being redirected');</script>"); 

回答

1

的问题不在于没有在Page_Init任何页面。问题是服务器没有向浏览器发送任何内容,因为Page Lifecycle太早。 (更多)

在正常情况下,即使您调用Response.Write,响应数据也不会发送到浏览器,直到渲染事件。在Response.Write BUT之后立即调用Response.Flush()可能会迫使这经常会产生意想不到的后果。在Page_Init循环中,我认为调用Response.Flush()可能会导致很多问题。

您可能会更好地使用“we're redirecting”消息创建静态html页面,并使用javascrip.SetTimeout方法倒计时并在几秒钟后使用javascript重定向。这就是多年来在网络上完成的。当用户未被授权时,您的基类可以简单地重定向到此页面。

“重定向”页面的代码。

<html> 
<head> 
<script type="text/javascript"> 
function delayedRedirect(){ 
    window.location = "/default.aspx" 
} 
</script> 
</head> 
<body onLoad="setTimeout('delayedRedirect()', 3000)"> 
<h2>You are not authorized to view this page, redirecting you</h2> 
</body> 
</html> 
+0

是啊...不完全知道如何字呢......但我想,是问题。有没有办法解决这个问题,因为安全类所做的所有工作都是在'Page_Init'期间完成的?我不反对做一些C#编码来定制警报,我只需要以某种方式提醒用户 –

+0

我编辑了我的回复来解决这个问题。 – David

+0

不完全是我所希望的解决方案,但它工作:)谢谢! –

0

你需要做的实现基础页面等在Page_Load事件的逻辑:

ScriptManager.RegisterStartupScript(this, this.GetType(), "keykey", "alert('You do not have access to this page. You are being redirected'); window.location='http://caracol.com.co';", true); 
+0

这是我试图避免的,因为每个页面都有自己的'Page_Load'事件,但是我试图实现的安全逻辑在'Page_Init'事件中被控制在父'PageBase'类中 –

+0

我不知道如果我不理解,但...你不能只是将安全逻辑移动到PageBase上的OnLoad并以这种方式解决它? – Icarus