惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
腾讯CDC
D
Docker
G
Google Developers Blog
D
DataBreaches.Net
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
S
SegmentFault 最新的问题
The Cloudflare Blog
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Stack Overflow Blog
Stack Overflow Blog
大猫的无限游戏
大猫的无限游戏
量子位
美团技术团队
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Bireyou

Visual Studio 更改护眼颜色 修复SQL中的孤立账户 在SQL中查看文件组中有哪些表 出现“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”的解决方法 Ext.Net开发过程中问题集锦 SQL Server 2005 中重建Master数据库 ASP.NET实现下载的中文文件名乱码处理 - Bireyou - 博客园 NUnit2.0详细使用方法 如何配置和部署安全的.NET三层应用 ASP.NET如何在客户端调用服务端代码 ASP.NET 2.0 绑定高级技巧 - Bireyou 把.NET程序部署到没有安装.NET Framwork的机器上 SourceGrid 2.0 认识ASP.NET配置文件Web.config 加密Web.config中的信息 DataGrid中创建复杂表头方法 showModalDialog()、showModelessDialog()详解 每一项都是js中的小技巧,但十分的实用! javascript函数库
在ASP.NET页面间传递任意数据的方法与实例
Bireyou · 2005-10-26 · via 博客园 - Bireyou

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

关于不同页面之间传递参数,一般常规用法是:
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()
     {
        //
        // TODO: 在此处添加构造函数逻辑
        //
     }

     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

  }
}