Оповещение на Page_Init

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

person Jordan Foreman    schedule 27.07.2011    source источник


Ответы (2)


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

В обычных условиях данные ответа не отправляются в браузер до наступления события 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> 
person David    schedule 27.07.2011
comment
да... не был точно уверен, как это сформулировать... но я понял, что проблема была в этом. Есть ли способ обойти это, поскольку вся работа, выполняемая классом безопасности, выполняется во время Page_Init? Я не против написания кода на С# для создания пользовательского оповещения, мне просто нужно как-то предупредить пользователя. - person Jordan Foreman; 27.07.2011
comment
Не совсем то решение, на которое я надеялся, но оно работает :) спасибо! - person Jordan Foreman; 27.07.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);
person Icarus    schedule 27.07.2011
comment
это то, чего я пытался избежать, поскольку каждая страница имеет свое собственное событие Page_Load, но логика безопасности, которую я пытаюсь реализовать, контролируется в родительском классе PageBase во время события Page_Init - person Jordan Foreman; 27.07.2011
comment
Я не знаю, не понимаю ли я, но... не могли бы вы просто переместить логику безопасности в OnLoad на PageBase и решить ее таким образом? - person Icarus; 27.07.2011