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