若依照原先自行設定的網頁移轉邏輯,希望A.aspx網頁經過一些處理後,希望跑到B.aspx網頁去。
有幾種作法:
透過程式端的寫法,可利用Server.Transfer("B.aspx"),直接在server端導向B.aspx去,此方法網址列不會改變。(還是A.aspx)
另一種程式端的寫法是用Response.Redirect("B.aspx"),這種作法是在client端執行(就如同使用javascript來轉址般),網址會改變。(變成B.aspx)
若是透過Button上的設定,可透過PostBackUrl的屬性設定為"~/B.aspx",則觸發按鈕後會轉址到B.aspx去。
為了去偵測user是如何到達B網頁(判斷是否為正常程序等),我們可以使用Page的PreviousPage以及其isCrossPagePostBack的屬性來判斷。
首先,在B網頁中先判斷this.PreviousPage是否為null。
測試結果:
使用直接打網址到B.aspx,或Response.Redirect("B.aspx")方式,則為null。
使用Server.Transfer("B.aspx")或Button上設定PostBackUrl,則非null。
因此,從後兩種方法,可以再接著偵測下去,看看其this.PreviousPage.isCrossPagePostBack的屬性為true或false。
測試結果:
若是Server.Transfer("B.aspx")方式,則isCrossPagePostBack為false。
而Button上設定PostBackUrl的話,其值為true。
因此我們可以厘清,若是使用client端的Response.Redirect("B.aspx"),能夠掌握的資訊最少。
而使用PostBackUrl,則可以掌握到是否透過跨網頁方式到達目的網頁,可做一些判斷的機制。
在B.aspx的Page_Load中可以加入以下程式碼做上述三種模式的判斷:
protected void Page_Load(object sender, EventArgs e) { if (this.PreviousPage != null) { if (this.PreviousPage.IsCrossPagePostBack) { Response.Write("PreviousePage: Cross"); } else { Response.Write("PreviousePage: No Cross"); } } else { Response.Write("No Previous Page"); } }