我有一个由PageBase类调用的安全类(所有页面都将继承),它将用户重定向到主页或登录页面(取决于他们是否登录),如果他们试图访问他们无权查看的页面。我想通过说出像
这样的内容来提醒用户 "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>");
答案 0 :(得分:1)
问题不在于Page_Init上没有任何页面。问题是服务器没有向浏览器发送任何内容,因为它在Page Lifecycle中太早了。 (更多来了)
在正常情况下,即使您调用Response.Write,也不会在Rendering事件之前将响应数据发送到浏览器。这通常可以通过在Response.Write之后立即调用Response.Flush()来强制执行,但这通常会产生意想不到的后果。在Page_Init循环中,我认为调用Response.Flush()可能会导致很多问题。
您最好只使用“我们重定向”消息创建静态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>
答案 1 :(得分: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);