近來(lái)論壇中關(guān)于在不同頁(yè)面之間傳遞參數(shù)的問題很多,在此做一個(gè)簡(jiǎn)單的說(shuō)明,希望給給朋友們一些幫助,也希望朋友們能開展更多這方面的討論,歡迎高手們提出自己更好的方法。
關(guān)于不同頁(yè)面之間傳遞參數(shù),一般常規(guī)用法是:
1、通過(guò)URL后帶的參數(shù)
這種方法受限制很多,一是將參數(shù)暴露出來(lái),容易帶來(lái)一些安全方面的隱患,二是所帶參數(shù)如果數(shù)量較多,控制起來(lái)也很麻煩;
2、通過(guò)常規(guī)表單中的POST提交
這種方法最常用,但在ASP.NET頁(yè)面中的FROM控件無(wú)法象一般FORM那樣將參數(shù)傳到另一頁(yè)面,需要通過(guò)特定的方式,否則和第一種方式無(wú)異。
3、Session方式
傳統(tǒng)方式之一,對(duì)于特定的環(huán)境有利,釋放也比較容易
4、通過(guò)接口或類的方式實(shí)現(xiàn)。我們主要討論一下這個(gè)方法。
基于WEB方式,使用變量傳遞必須要使用私有變量,因?yàn)楹芎?jiǎn)單,如果你使用公有或靜態(tài)變量,那會(huì)出現(xiàn)極大的混亂,朋友們可以考慮一下為什么?
如果用類的屬性,一個(gè)問題是對(duì)象的生存時(shí)間和范圍限制我們不能以私有的方式來(lái)進(jìn)行傳遞。
下面是結(jié)合一些SDK中的一些方法寫的一個(gè)例子,供參考:
說(shuō)明:為了進(jìn)行更大數(shù)量和類型的參數(shù)的傳遞,也是chequan朋友的問題,考慮使用結(jié)構(gòu)來(lái)實(shí)現(xiàn)。結(jié)構(gòu)有其好處,合理使用,應(yīng)該不會(huì)造成太大的資源占用,特別是在這種傳遞上。有想法的朋友也可以一起討論一下結(jié)構(gòu)的使用。
例子:
做一個(gè)類文件,為Trancfer.cs,內(nèi)容如下:
using System;
namespace WEBLOG.Class
{
/// <summary>
/// 定義一個(gè)結(jié)構(gòu),需要傳遞的內(nèi)容可以由自己來(lái)定義,可以定義多個(gè)結(jié)構(gòu),以適合自己的需要
/// </summary>
public struct NormalUserRegInfo
{
public string UserName;
public string UserPassWord;
public string Quesion;
public string Answer;
public string UserEmail;
public string UserClass;
}
/// <summary>
/// 此接口定義了一個(gè)返回所需傳遞對(duì)象的屬性
/// 發(fā)送對(duì)象的頁(yè)面必須實(shí)現(xiàn)此接口
/// </summary>
public interface ITransferface
{
TrancferClass TranceferObject{get;set;}
}
/// <summary>
/// Trancfer 的摘要說(shuō)明。
/// </summary>
public class TrancferClass
{
public TrancferClass()
{
//
// TOD 在此處添加構(gòu)造函數(shù)邏輯
//
}
private NormalUserRegInfo _strMessage;
public NormalUserRegInfo TranceferMessage
{
get
{
return this._strMessage;
}
set
{
this._strMessage = value;
}
}
}
}
有了這個(gè)類,就可以在頁(yè)面中進(jìn)行操作了,
假設(shè)我們有一個(gè)頁(yè)面,名為Set.aspx,通過(guò)一個(gè)Button將一些參數(shù)發(fā)到Get.aspx頁(yè)面中,
這兩個(gè)頁(yè)面的相關(guān)代碼如下:
====================
Set.aspx.cs
====================
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using WEBLOG.Class;
namespace WEBLOG
{
/// <summary>
/// Set 的摘要說(shuō)明。
/// </summary>
public class Set : System.Web.UI.Page,ITransferface
{
protected System.Web.UI.WebControls.Button Button1;
private TrancferClass _temptrancefer;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁(yè)面
_temptrancefer = new TrancferClass();
}
#region Web 窗體設(shè)計(jì)器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調(diào)用是 ASP.NET Web 窗體設(shè)計(jì)器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內(nèi)容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
//實(shí)現(xiàn)ITransferface接口
public TrancferClass TranceferObject
{
get
{
return this._temptrancefer;
}
set
{
this._temptrancefer = value;
}
}
private void Button1_Click(object sender, System.EventArgs e)
{
//定義一個(gè)結(jié)構(gòu),傳遞這個(gè)結(jié)構(gòu)
NormalUserRegInfo temptest = new NormalUserRegInfo();
temptest.Answer="AAAAAAAAAAAAAAAA";
temptest.Quesion="BBBBBBBBBBBBB";
temptest.UserName="CCCCCCCCCCCCCCCCC";
temptest.UserPassWord="DDDDDDDDDDDDDDDDDDDDDDDDD";
this.TranceferObject.TranceferMessage = temptest;
//調(diào)用Server.Transfer(),轉(zhuǎn)向執(zhí)行Get.aspx
Server.Transfer("Get.aspx");
}
}
}
====================
Get.aspx.cs
====================
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using WEBLOG.Class;
namespace WEBLOG
{
/// <summary>
/// Receiver 的摘要說(shuō)明。
/// </summary>
public class Get : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
ITransferface mySender;
if(!IsPostBack)
{
//判斷當(dāng)前頁(yè)面的HttpHandler,如果實(shí)現(xiàn)了ITransferface接口
//就轉(zhuǎn)換成ITransferface
if(Context.Handler is ITransferface)
{
mySender = (ITransferface)Context.Handler;
NormalUserRegInfo tempreceive =mySender.TranceferObject.TranceferMessage;
Response.Write(tempreceive.Answer + "<BR>");
Response.Write(tempreceive.Quesion + "<BR>");
Response.Write(tempreceive.UserName + "<BR>");
Response.Write(tempreceive.UserPassWord + "<BR>");
}
else
{
Response.Write("沒有接收到任何參數(shù)");
}
}
}
#region Web 窗體設(shè)計(jì)器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調(diào)用是 ASP.NET Web 窗體設(shè)計(jì)器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內(nèi)容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}