1

我有一个由 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>");
4

2 回答 2

1

问题不在于 Page_Init 上没有任何页面。问题是服务器没有向浏览器发送任何内容,因为它在Page Lifecycle中太早了。(更多即将到来)

在正常情况下,响应数据直到 Rendering 事件才会发送到浏览器,即使您调用了 Response.Write。这通常可以通过在 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> 
于 2011-07-27T14:02:21.270 回答
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);
于 2011-07-27T15:58:50.457 回答