程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 一個大家不常用到,卻很有用的頁面間傳值方法(Context.Handler)

一個大家不常用到,卻很有用的頁面間傳值方法(Context.Handler)

編輯:.NET實例教程

一、目前在ASP.Net中頁面傳值共有這麼幾種方式:
1、表單提交,
<form action= "target.ASPx" method = "post" name = "form1">
<input name = "param1" value = "1111"/>
<input name = "param2" value = "2222"/>
</form>
....
form1.submit();
....
此種方在ASP。NET中無效,因為ASP。NET的表單總是提交到自身頁面,如果要提交到別一頁面,需要特殊處理。
2、<A href="target.ASPx?param1=1111&param2=2222">鏈接地址傳送</A>
接收頁面: string str = Request["param1"]
3、Session共享
發送頁面:Session("param1") = "1111";
按收頁面 string str = Session("param1").ToString();
4、Application共享
發送頁面: Application("param1") = "1111";
按收頁面: string str = Application("param1").ToString();
此種方法不常使用,因為Application在一個應用程序域范圍共享,所有用戶可以改變及設置其值,故只應用計數器等需要全局變量的地方。
5、CookIE
6、Response.Redirect()方式
Response.Redirect("target.ASPx?param1=1111&param2=2222")
接收頁面: string str = Request["param1"]
7、Server.Transfer()方式。
Server.Transfer("target.ASPx?param1=1111&param2=2222")
接收頁面: string str = Request["param1"]

二、如果在兩個頁面間需要大量的參數要傳傳遞,如數據查詢等頁面時,用1 - 6的方法傳值及其不便,而第 7 種方法確有一獨特的優勢!但使用該方法時需要一定的設置,現簡單介紹一下該方法的使用方式:
以查詢數據頁面為例:
在查詢頁面中設置如下公有屬性(QueryPage.ASPx):



public class QueryPage : System.Web.UI.Page
...{
protected System.Web.UI.WebControls.TextBox txtStaDate;
protected System.Web.UI.WebControls.TextBox txtEndDate;
...
/**//// <summary>
/// 開始時間
/// </summary>
public string StaDate
...{
get...{ return this.txtStaDate.Text;}
 set...{this.txtStaDate.Text = value;}
}
/**//// <summary>
/// 結束時間
/// </summary>
public string EndDate
...{
get...{ return this.txtEndDate.Text;}
set...{this.txtEndDate.Text = value;}
}
....
private void btnEnter_Click(object sender, System.EventArgs e)
...{
Server.Transfer("ResultPage.aspx"); //注意:使用ResultPage.ASPx來接收傳遞過來的參數
}
}



在顯示查詢結果頁面(ResultPage.ASPx):



public class ResultPage : System.Web.UI.Page

...{
private void Page_Load(object sender, System.EventArgs e)
...{

//轉換一下即可獲得前一頁面中輸入的數據
QueryPage queryPage = ( QueryPage )Context.Handler;    //注意:引用頁面句柄

Response.Write( "StaDate:" );
Response.Write( queryPage.StaDate );
Response.Write( "<br/>EndDate:" );
Response.Write( queryPage.EndDate );
}
}


三、如果有許多查詢頁面共用一個結果頁面的設置方法:
在這種方式中關鍵在於“ QueryPage queryPage = ( QueryPage )Context.Handler; ”的轉換,只有轉換不依賴於特定的頁面時即可實現。
如果讓所有的查詢頁面都繼承一個接口,在該接口中定義一個方法,該方法的唯一作用就是讓結果頁面獲得構建結果時所需的參數,就可實現多頁面共享一個結果頁面操作!

1、先定義一個類,用該類放置所有查詢參數:(*.cs)

 



/**//// <summary>
/// 結果頁面中要用到的值
/// </summary>
public class QueryParams
...{
private string staDate;
private string endDate;

**//// <summary>
/// 開始時間
/// </summary>
public string StaDate
...{
get...{ return this.staDate;}
set...{this.staDate = value;}
}
/**//// <summary>
/// 結束時間
/// </summary>
public string EndDate
...{
get...{ return this.endDate;}
set...{this.endDate = value;}
}
}


2、接口定義:



/**//// <summary>
/// 定義查詢接口。
/// </summary>
public interface IQueryParams
...{
/**//// <summary>
/// 參數
/// </summary>
QueryParams Parameters...{get;}
}


3、查詢頁面繼承IQueryParams接口(QueryPage.ASPx):



**//// <summary>
///查詢頁面,繼承接口
/// </summary>
public class QueryPage : System.Web.UI.Page, IQueryParams
...{
protected System.Web.UI.WebControls.TextBox txtStaDate;
protected System.Web.UI.WebControls.TextBox txtEndDate;

private QueryParams queryParams;
...
/**//// <summary>
/// 結果頁面用到的參數
/// </summary>
public QueryParams Parameters
...{
get
...{
return queryParams;
}
}
....
private void btnEnter_Click(object sender, System.EventArgs e)
...{
//賦值
queryParams = new QueryParams();
queryParams.StaDate = this.txtStaDate.Text;
queryParams.EndDate = this.txtEndDate.Text

Server.Transfer("ResultPage.ASPx");
}
}


4、別外的頁面也如此設置
5、接收頁面(ResultPage.ASPx):

 



public class ResultPage : System.Web.UI.Page
...{
private void Page_Load(object sender, System.EventArgs e)
...{

QueryParams queryParams = new QueryParams();
IQueryParams queryInterface;
//實現該接口的頁面
if( Context.Handler is IQueryParams)
...{
queryInterface = ( IQueryParams )Context.Handler;
queryParams = queryInterface.Parameters;
}

Response.Write( "StaDate:" );
Response.Write( queryParams.StaDate );
Response.Write( "<br/>EndDate:" );
Response.Write( queryParams.EndDate );
}
}



三、本文起因:
因在工作中要作一個數據查詢,參數煩多,原先是用Session傳遞,用完該Session傳來的參數後,還需清理Session,在用Session之前還得判斷該Session是否存在,極其煩瑣,我想應該還有更簡便的方法來實現頁面間的參數傳遞,故上網查找,終於找到這樣一種方式來實現頁面間的參數傳遞。
有不到之處,請大家指正!
 ==================================================================================

首先來看HttpContext類:
System.Web.HttpContext類繼承自System.Object,按類名來理解,即是Http上下文類.

此類封裝了有關單個HTTP 請求的所有HTTP 特定的信息。此類為繼承 IHttpModule 和 IHttpHandler 接口的類提供了對當前 HTTP 請求的 HttpContext 對象的引用。該對象提供對請求的內部 Request、Response 和 Server 對象的訪問。

HttpContext類的常用公共屬性有:
Application,為當前 HTTP 請求獲取HttpApplicationState 對象。
Current, 為當前 HTTP 請求獲取 HttpContext 對象。
Handler, 為當前 HTTP 請求獲取或設置 IHttpHandler 對象。
Items,獲取可用於在 HTTP 請求過程中在 IHttpModule 和 IHttpHandler 之間組織和共享數據的鍵值集合。
Request,為當前 HTTP 請求獲取 HttpRequest 對象。
Response,為當前 HTTP 響應獲取 HttpResponse 對象。
Server, 獲取提供用於處理 Web 請求的方法的 HttpServerUtility 對象。
Session, 為當前 HTTP 請求獲取 HttpSessionState 實例。

通過Page類的Context屬性可以獲得當前的System.Web.HttpContext對象


接著來看Server.Transer()方法:
通過Page類的Server屬性類可以Transfer到另一個頁面,如Server.Transfer("NewPage.ASPx"),可以跳轉到新頁面中,
使用Server.Transfer()跳轉頁面,客戶端的URL並不會改變,只是在服務器端執行新頁並輸出,因此可以在新頁面中通過獲取來獲得請求頁面傳遞的對象和表單數據及查詢字符串.

假定當前頁面為FormerPage.aspx(類名為FormerPage), 跳轉到的新頁面為NewPage.ASPx
從FormerPage.ASPx跳轉的代碼如下:



private void  btnToNewPage_Click(object sender, System.EventArgs e)
{
   ArrayList list = new ArrayList(3);
   list.Add("This list ");
   list.Add("is for ");
   list.Add("FormerPage to see.");

   Context.Items["FormerPageList1"] = list;

   Server.Transfer("NewPage.ASPx");
}


在新頁面(NewPage.ASPx)Page_Load()事件中通過如下代碼獲得傳遞的數據:



         
            if(!IsPostBack)
            {
             try
                {
                    FormerPage former = (FormerPage)Context.Handler;                
                    txtFromParentPage.Text = former.ClassName; //獲取FormerPage中定義的ClassName公共屬性
                   
                    //獲取在FormerPage中的上下文字典中添加的ArrayList: Context.Items["FormerPageList1"]
                    //獲取Contex字典項並強制轉換類型:
                    ArrayList list = Context.Items["FormerPageList1"] as ArrayList;
 
                    DataSet ds = former.GetDataSet();  //調用FormerPage中定義的GetDataSet()公共方法
                    DataGrid1.DataSource = ds;
                    DataGrid1.DataBind();
                }
                catch
                {
                    Response.Write("Error get data from parent transfer page!");
                }
                
            }


注意上面通過Context.Hander屬性來獲取當前Http請求的IHttpHander對象,並強制轉換成FormerPage對象:


FormerPage former = (FormerPage)Context.Handler;

後面可以直接調用這個類的公共屬性,方法.同時可以調用在FormerPage中添加的Context字典項(Dictionary Item).

值得注意的是,使用Server.Transer傳遞頁面數據,並使用Context.Handler來接收數據,只有在頁面首次加載時,才可以正確獲取上一頁面的實例,而在postback時,獲取的就會是當前頁面的實例.

比如在NewPage.ASPx中,首次加載時可以獲取FomerPage對象,而在回發時嘗試獲取FormerPage會拋出異常,因為回發時,請求頁面已經發生改變,不再是FormerPage發出的請求,而是自身NewPage發出的請求.我們可以在Page_Load()中加入如下代碼判斷Http請求是由哪個頁面發出的:



            string path = Context.Request.Path; 
            Response.Write("<script>alert('Request from:" + path + "');</script>");


另外,Server.Transer()有一個重載的方法Server.Trasfer(string newpage,bool preserveForm), 第二個參數用來指定是否保留HttpRequest.Form和HttpRequest.QueryString集合,若為true, 則原頁面的Form和QueryString在新的頁面中依然有效,可以被調用. 如:



string str = "Value of Textbox:"+Request.Form["TextBox1"] +"<br>"; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved