近来论坛中关于在不同页面之间传递参数的问题很多,在此做一个简单的说明,希望给给朋友们一些帮助,也希望朋友们能开展更多这方面的讨论,欢迎高手们提出自己更好的方法。
关于不同页面之间传递参数,一般常规用法是:
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
}
}