ASP.NET菜鸟进阶-页面间参数传递

网络上有很多关于页面间参数传递的文档,我这里只是汇总大家的各种方法,供以后参考。
列出引用地址,请大家不要骂我抄袭, 只是想方便自己以后查找.
<aierongASP.NET状态存储管理九大兵器之一(概括篇)>
另外还参考了<飞翔的天空的.net页面间的参数传递简单实例>,在网上搜索到很多与该文类似,不知谁是原创,望谅。
1.QueryString
该方法的优点就是实现简单,但传递的值会在在浏览器地址栏中显示,故不安全(有网友将待传的值加密,接收后再解密,或者用数据库作为中介),再者Querystring不能传递对象。在传递值少且对安全性不高的情况下可以使用。
源页面代码:
方法一(服务器端):
string url = "GetParameters.aspx?par1=" + this.txtPar1 + "&par2=" + this.txtPar2;
Response.Redirectt(url);
方法二(客户端):
<html>
   <head>
      <script language="javascript">
         function LoadPage()
         {
            var par1 = document.Form1.txtParValue.value;
            HrefUrl.href = "GetParameters.aspx?par1=" + par1;
            HrefUrl.click();
         }
      </script>
   </head>
   <body>
      <form id="Form1" method="post" runat="server">
         <a id="HrefUrl" href="" target="_blank"></a>
         <div><input type="button" οnclick="LoadPage();" value="Click me" id="btnSentPar" /></div>
         <div><input type="text" id="txtParValue" /></div>
      </form>
     </body>
</html>
只是举个简单的例子,当然还有很多其他的方法。
目标页面代码:
string par = Request.QueryString["par1"].ToString();
如果是中文字符得进行编码和解吗:
传送时用Server.UrlEncode方法编码,接收时用Server.UrlDecode解码.
传递:
string url="http://www.cnblogs.com/aierong/admin/EditPosts.aspx?opt="+Server.UrlEncode("我们");
Response.Redirect(url);
接收:
string str=Server.UrlDecode(Request.QueryString["opt"]);
这样str就等于"我们"
当然我们还有一省事的方法:
在web.config中修改globalization节为
<globalization
            requestEncoding="gb2312"
            responseEncoding="gb2312"
/>
2.Session
session可以传递对象,当存储过多的数据会消耗过多的服务器资源,应该慎重使用,我们应该在适当的时候适当的清理一些不需要的session来降低无谓的资源消耗。存储仅仅对访问者在会话的活动期间打开的网页可用的变量和对象,适用于局部会话间的网页数据传递。
源页面代码:
Session["name"] = this.TextBox1.Text;
目标页面代码:
this.TextBox1.Text = Session["name"].ToString();
Session.Remove("name");

3.Server.Transfer
该方法相对复杂一点,但非常有用,可以在另一个页面以对象属性的方法存取显露的值,简单且面向对象。
实现过程:
源页面代码:
SourcePage.apsx
添加属性:
public string Name
{
   get {   return TextBox1.Text;   }
}
调用Server.Transfer方法:
private void Button1_Click(object sender, System.EventArgs e)
{
   Server.Transfer("GoalPage.aspx");
}
目标页面代码:
GoalPage.aspx
<%@ Reference Page = "WebForm1.aspx" %>
cs
private void Page_Load(object sender, EventArgs e)
{
   //create instance of source page
   SourcePage sp;
   //get refer. 
   sp = (SourcePage)Context.Handler;
   this.TextBox1.Text = sp.Name;
}

4.Cookies
cookie是在浏览页面时Web服务器在客户端所写入的一些小文件,存放在浏览器端本机磁盘上,而不是存放在服务端的。可以在发送数据时写入cookie,接收时读取cookie完成数据在Web页面间的传送。浏览器对 Cookie 的大小有限制,只有不超过 4096 字节才能保证被接受
写Cookie:
HttpCookie ckeName = new HttpCookie("name");
ckeName.value = this.TextBox1.Text;
Response.SetCookie(ckeName);
写Cookie:
    //方法1
   Response.Cookies["username"].value="mike";
   Response.Cookies["username"].Expires=DateTime.MaxValue;

    //方法2
   HttpCookie acookie = new HttpCookie("last");
   acookie.Value="a";
   acookie..Expires=DateTime.MaxValue; 
   Response.Cookies.Add(acookie);

    //方法3
   Response.Cookies["userinfo1"]["name"].value="mike";
   Response.Cookies["userinfo1"]["last"].value="a";
   Response.Cookies["userinfo1"].Expires=DateTime.MaxValue;

    //方法4
   HttpCookie cookie = new HttpCookie("userinfo1");
   cookie.Values["name"]="mike";
   cookie.Values["last"]="a";
   cookie.Expires=DateTime.MaxValue; 
   Response.Cookies.Add(cookie);

取Cookie(注意:在获取Cookie的值之前,应该确保该 Cookie 确实存在。否则将抛出异常)

   HttpCookie ckeName = Request.Cookies["name"];
   this.TextBox1.Text = ckeName.value;

   If (Request.Cookies["userName"]!=null)
   {
       string str = Request.Cookies("userName").Value; 
   }

   //多值Cookie的读取
   If ( Request.Cookies["userInfo1"]!=null )
   {
     string name=Request.Cookies["userInfo1"]["name"];
     string last=Request.Cookies["userInfo1"]["last"]; 
   }

   //读取 Cookie 集合
   for(int i = 0 ;i<Request.Cookies.Count ;i++)
   {   
       HttpCookie cookies = Request.Cookies[i];
       Response.Write("name="+cookies.Mame+"<br>");
       if (cookies.HasKeys )//是否有子键
       {
           System.Collections.Specialized.NameValueCollection NameColl
                                             = aCookie.Values ;
           for(int j=0;j<NameColl.Count;j++)
           {
               Response.Write("子键名="+ NameColl.AllKey[j] +"<br>");
               Response.Write("子键值="+ NameColl[j] +"<br>");
           }

       }
       else
       {
           Response.Write("value="+cookies.Value+"<br>");        
       }
   }

修改Cookie同写Cookie
删除Cookie
   HttpCookie cookie = new HttpCookie("userinfo1");
None.gifcookie.Expires
=DateTime.Now.AddDays(-30); 
None.gifResponse.Cookies.Add(cookie);


5.Application
application对象是记录整个网站全局信息的,可以在不同场所不同浏览器不同用户间共享,无论有几个浏览者同时存取网页,都只会产生一个application对象实例,
定义方法:
Application["name"] = "appName";
取值
string val = (String)Application["name"];

6.隐藏字段传递参数
通过在网页上制作表单交互区域,用户在浏览器端输入数据,然后通过form提交到服务器,在提交后的接受form数据的页面里就可以接收到相应数据,即form的action页面中可以使用request对象来接收所传递的数据。
源页面代码:
<body>
   <form id="Form1" method="post" runat="server">
      <div><input type="hidden" name="UserId" value="TransferValueByHiddenField" /></div>
      <div><asp:Button id="btnTransfer" value="Click me" runat="Server"></asp:Button></div>
   </form>
</body>
cs代码:
private void btnTransfer_Click(object sender, EventArgs e)
{
   Server.Transfer("WebForm2.aspx");
}
目标页面代码:
string userId = Request.From("UserId").ToString();
此方法不宜传递对象和复杂数据

7.通过序列化对象
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。 
在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;按值将对象从一个应用程序域发送至另一个应用程序域。例如,序列化可用于在ASP.NET 中保存会话状态,以及将对象复制到 Windows 窗体的剪贴板中。它还可用于按值将对象从一个应用程序域远程传递至另一个应用程序域。
 
8.ViewState

9.HttpContext.Items
HttpContext.Items中的数据生命周期是很短的, 只存在于当前请求中, 页面的刷新或者访问另外一个页面都会使HttpContext.Items中的数据丢失, 在实际应用中, HttpContext.Items的缓存对提高性能的影响不大

9.HttpContext.Cache

10.中介媒体(文件,数据库等)

结束语:QueryString方式和form方式简单,可实现简单数据传递,一般为字符串类型,但是安全性差,而且必须是连续页面间数据传递。Cookie只能存放string类型的数据,如果想要存放更为复杂的数据类型,那么必须先将其转换为string类型。Application对象和Session对象操作相对复杂些,浏览量非常大的网页使用时应适量,而且使用结束后尽量清除,否则大量使用有可能会导致服务器的瘫痪。Session变量的安全性较高,可传递专用浏览端数据。

转载于:https://www.cnblogs.com/Niyowong/archive/2007/08/10/849984.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值