最近做項目遇到一個奇怪的問題:如果瀏覽器session丟失後,點擊一個按鈕,觸發一個Ajax方法,瀏覽器會彈出一個對話方塊。異常資訊如下:
後來經過尋找,原來我的頁面繼承了一個BasePage.cs檔案,BasePage.cs檔案裡判斷session是否存在,如果不存在直接跳轉到登入頁(這裡使用的跳轉是Response.Redirect())。正是因為有這跳轉代碼的存在所有才導致了報錯。Ajax方法是無法執行頁面跳轉的操作的。這裡如果需要讓Ajax方法執行跳轉頁面的操作,需要在web.Config檔案裡配置一下。添加以下代碼即可:
<system.web>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
</system.web>
有的時候可能你會說,我的設定檔裡面已經加上了這個配置資訊,為什麼頁面還是會報錯呢?
這種方式只支援你在cs檔案裡面執行Response.Redirect()的跳轉,不支援Server.Transfer()和Server.Execute()的轉寄,以及Response.Write("<script></script>")在頁面輸出指令碼跳轉。
但是你可以使用Response.Redirect()跳轉到指定頁,在那個指定頁裡面寫js指令碼。
當然了,如果你偏不要在設定檔裡加上這段代碼,你也可以象網上說的那樣在分頁檔加上如下Js指令碼對異常資訊進行友好的處理。
<script language="javascript" type="text/javascript">
//當使用ajax的頁面,session丟失時,彈出提示並轉向
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); function EndRequestHandler(sender, args)
{
if (args.get_error() != undefined){
if(args.get_error().message.substring(0, 51) == "Sys.WebForms.PageRequestManagerParserErrorException")
window.location.reload(); //出現Session丟失時的錯誤處理,可以自己定義。
else
alert( "登入逾時,請重試! "); //其他錯誤的處理。
args.set_errorHandled(true);
}
}
</script>