標籤:c#
使用Request.UrlReferrer時需要注意:
1. 如果上一頁面使用document.location方法導航到當前頁面,Request.UrlReferrer返回空值
2. 如果有A,B兩個頁面,在瀏覽器中直接請求A頁面,在A頁面的中Page_Load事件中導航到B 頁面,則 Request.UrlReferrer返回空。因為 在 Page_load事件中頁面還未初始化,所以無法記錄當前頁的資訊,導航到b頁面也就無法獲得上一頁面的資訊
3. 點擊重新整理按鈕不會改變Request.UrlReferrer
方法一:
1. 首先在Page_load中獲得並儲存該資訊
C#代碼
Page_load(object obj,EventArgs e)
{
if(!IsPostBack)
{
if(Request.UrlReferrer!=null) //
{
ViewState["UrlReferrer"]=Request.UrlReferrer.ToString();
}
}
}
(1)頁面回傳後會改變Request.UrlReferrer,將其指向當前頁面,所以需要進行判斷:只有在第一次請求頁面的時候才儲存該資訊
(2)因為可能“上一次”的url不存在,所以需要進行判斷,只有在Request.UrlReferrer存在的情況下才進行儲存
2.然後在返回函數中使用該資訊
C#代碼
protected void btnBack_Click(object sender, EventArgs e)
{
Response.Redirect(ViewState["BackUrl"].ToString());
}
方法二:
在C# Web程式中,如為頁面按鈕寫返回上一頁代碼
this.RegisterClientScriptBlock("E", "<script language=javascript>history.go(-2);</script>");
其中,history.go(-2),要寫為-2,因在按鈕事件觸發前,已重新整理一次頁面,所以應是-2。
Response.Write("<script language=javascript>history.go(-2);</script>");
此處也要寫為“-2”。跟直接寫指令碼的有所不同。
C# ASP.NET 返回上一頁的通用代碼
我們知道返回上一頁是 history.go(-1), 如果在本頁面回傳N次,則返回上一頁就是: history.go(-N) 。這樣的優點是,不僅返回上一頁(前一頁,上頁,前頁),而且保留表單裡的全部資料(眾多的選擇項)。如果使用Response.Redirect()直接返回就全部遺失資料,當然你也可以使用Session, cookies以及ViewState來儲存恢複使用,只不過麻煩些。
以下有兩種方法供選擇,這些代碼都是固定不變的,建議使用方法2,可多個頁面同時使用。
一. 方法1:單獨使用,需要前台代碼和後台代碼
1.在後台my.aspx.cs裝載函數中
void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack) //是首次裝載,不是回傳
{
ViewState["back_no"]=0; //隱藏的表單欄位ViewState,是頁面級的
}
ViewState["back_no"]=Convert.ToInt32(ViewState["back_no"])+1;
}
2.在前台my.aspx頁面加入語句:
<input type="button" value="返回上一頁" onclick=‘history.go(-<%= (int)ViewState["back_no"] %>)‘>
二. 方法2:通用代碼,僅需要後台代碼
在需要的後台代碼檔案中調用如下:
1.在後台myself.aspx.cs裝載函數中
protected void Page_Load(object sender, EventArgs e)
{
my_common.SetBackPageNo(this);//累計本頁面重新整理次數,以便後面得到返回次數
}
2.在後台myself.aspx.cs,需要返回的函數中
public void btnBack_Click(object sender, EventArgs e) //返回到列表顯示頁
{
my_common.retLastPage(this);//根據上面的累計次數,直接返回父頁面,並保留其中的全部資料
}
3.為此,需要先建立通用的後台代碼檔案
檔案my_common.cs
using System.Web.UI.WebControls;
using System.Net;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
using System.Web.Configuration;
public class my_common
{
//這些方法都是靜態static ,類名直接調用,不用建立執行個體
static public void SetBackPageNo(System.Web.UI.Page Page)
{//在頁面的Page_Load 中調用,用全域的Session儲存返回父頁面的次數
//得到傳來頁面的檔案名稱,是唯一的,以示區別其它的Session
string back_name=System.Web.HttpContext.Current.Request.Path;
if (!Page.IsPostBack)
{
HttpContext.Current.Session[back_name] = 0; //首次進入本頁面,初始值設定為0
}
//累計本頁面重新整理次數(首次和回傳),以便後面得到返回次數,
HttpContext.Current.Session[back_num]=Convert.ToInt32(HttpContext.Current.Session[back_name]) + 1;
}
static public void retLastPage(System.Web.UI.Page Page)
{//在頁面的返回函數中調用,返回父頁面實際執行的代碼
//得到傳來頁面的檔案名稱,是唯一的,以示區別其它的Session
string back_name=System.Web.HttpContext.Current.Request.Path;
//根據上面的累計次數,一次直接返回父頁面,並保留其中的全部資料
string num = HttpContext.Current.Session[back_name].ToString();
string str = "<script language=javascript>history.go(-" + num + ");</script>";
Page.RegisterClientScriptBlock("key", str);
}
}
三. 補充說明
Javascript 返回上一頁
1. 上一頁表單裡的資料全部保留, 返回上一頁 history.go(-1), 返回兩個頁面: history.go(-2);
2. 上一頁資料全部丟失,是個新頁面 history.back(-1),等同於asp.net 的 Response.Redirect("list.aspx");
3. window.history.forward()返回下一頁
4. window.history.go(返回第幾頁,也可以使用訪問過的 URL)
這種好想不起作用 Rresponse.Write("<script language=javascript>history.go(-1);</script>")
C#:返回上一層