2011-07-27 85 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