我們在編寫基於 ASP.NET 的應用程式時,如果代碼執行出錯或檢測到異常,一般會提示使用者“返回”或“回退”,或者在多步操作、列表/詳細的查看介面中,也會給使用者提供回退到上一頁面的連結,對於這種情況,大家很快就會想到的簡單做法就是利用 Javascript 來實現,即 history.go(-1) ,但是由於 ASP.NET 頁面的 PostBack 機制,所以 history.go(-1) 可能還是當前頁面,而不能真正回退到上一頁面。
在 Classifieds Site Starter Kit 中,學習到一種不錯的關於回退的處理方法,可以分別在用戶端和伺服器控制項中實現頁面的回退,代碼如下:
1)首先在頁面中增加兩個屬性
//記錄上一個頁面的資訊
private string UrlReferrer
...{
get
...{
return ViewState["UrlReferrer"] as string;
}
set
...{
ViewState["UrlReferrer"] = value;
}
}
//記錄 PostBack 的次數
public int NumPostBacks
...{
get
...{
if (ViewState["NumPostBacks"] != null)
return (int)ViewState["NumPostBacks"];
else
...{
ViewState["NumPostBacks"] = 0;
return 0;
}
}
set
...{
ViewState["NumPostBacks"] = value;
}
}
// 記錄上一頁面的資訊或更新 PostBack 的次數
protected void Page_Load(object sender, EventArgs e)
...{
if (!Page.IsPostBack)
...{
if (Request.UrlReferrer != null)
this.UrlReferrer = Request.UrlReferrer.ToString();
}
else
NumPostBacks++;
int goBackSteps = NumPostBacks + 1;
BackLink.NavigateUrl = String.Format("javascript:history.go(-{0});", goBackSteps);
}
//在代碼中回退
protected void ReturnToPreviousPage()
...{
string referrer = UrlReferrer;
if (referrer != null)
Response.Redirect(referrer);
else
Response.Redirect("~/default.aspx", true);
3)直接在代碼中處理後援動作(如 Back_Click),可以直接調用如下方法
2)在 Page_Load 事件記錄上一頁面地址、更新 Postback 次數、設定回退連結的地址