Оповещение о Page_Init - PullRequest
1 голос
/ 27 июля 2011

У меня есть класс безопасности, который вызывается классом 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>");

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Проблема НЕ в том, что в Page_Init нет страницы. Проблема в том, что сервер ничего не отправляет в браузер, потому что это слишком рано в Page Lifecycle . (больше)

В нормальных условиях данные ответа не отправляются в браузер до события Rendering, даже если вы вызываете Response.Write. Это часто можно вызвать, вызвав Response.Flush () сразу после Response.Write, НО, что часто имеет непредвиденные последствия. Я думаю, что в цикле 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> 
0 голосов
/ 27 июля 2011

Вам необходимо реализовать логику для события 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);
...