ASP.NET三种传值方式

ASP.NET为我们提供了三种方式,一种是可以通过用QueryString来传送相应的值,再一种是通过session变量来传送相应的值,还有就是 通过Server.Transfer方法来实现。下面分别一一介绍:

一、使用Querystring

Querystring是一种非常简单的传值方式,其缺点就是:安全性低。会把要传送的值显示在浏览器的地址栏中(也就是不需要保密得参数),并且在此方法中不能够传递对象,参数的长度不能大于 1024字节(?),当参数中有中文得时候,通常需要使用HttpUlitity.UrlEncode方法来对参数进行编码和解码。

优点:速度快。如果你想传递一个安全性不是那么太重要或者是一个简单的数值时,用此方法最好不过了。下面通过一个小例子来完成传值工作,步骤如下: 1、创建一个web form 2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 3、为button按钮创建click事件 代码如下:

privatevoid Button1_Click (object sender, System.EventArgs e) { string url; url="webform2.aspx?name="+     TextBox1.Text +"&email="+     TextBox2.Text; Response.Redirect(url); }

4、新建一个目标页面命名为webform2 5、在webform2中放置两个Label1,Label2 在webform2的Page_Load中添加如下代码:

privatevoid Page_Load (object sender, System.EventArgs e) { Label1.Text=Request.QueryString["name"]; Label2.Text=Request.QueryString["email"]; }

运行,即可看到传递后的结果了。

二、使用Session变量

使用Session变量传值是一种最常见的方式了,此中方式不仅可以把值传递到下一个页面,还可以交叉传递到多个页面,直至把Session变量的值removed后,变量才会消失。举个例子看看: 1、创建一个web form 2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 3、为button按钮创建click事件 代码如下:

privatevoid Button1_Click (object sender, System.EventArgs e) {           Session["name"]=TextBox1.Text;              Session["email"]=TextBox2.Text;              Response.Redirect("webform2.aspx"); }

4、新建一个目标页面命名为webform2 5、在webform2中放置两个Label1,Label2 在webform2的Page_Load中添加如下代码:

privatevoid Page_Load (object sender, System.EventArgs e) {          Label1.Text=Session["name"].ToString();          Label2.Text=Session["email"].ToString();          Session.Remove("name");          Session.Remove("email"); }

运行,即可看到传递后的结果了。

这种方法得优缺点是:使用Session变量往往会占用服务器端的内存使用,所以再网页流量很大的时候,Session便不能很好的完成传值得任务,由于session有一个timeout,所以在使用的时候对用户得操作也有一定的影响。

三、使用Server.Transfer

虽然这种方法有点复杂,但也不失为一种在页面传值的方式。使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写一些代码以创建一些属性以便可以在另一个页面访问它,但是,这个方式带来的好处也是显而易见的. 举个例子看看: 1、创建一个web form 2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 3、为button按钮创建click事件 代码如下:

privatevoid Button1_Click (object sender, System.EventArgs e) {          Server.Transfer("webform2.aspx"); }

4、创建过程来返回TextBox1,TextBox2控件的值代码如下:

publicstring Name {   get    {     return TextBox1.Text;    } }
publicstring EMail {   get    {     return TextBox2.Text;    } }

5、新建一个目标页面命名为webform2 6、在webform2中放置两个Label1,Label2 在webform2的Page_Load中添加如下代码:

privatevoid Page_Load (object sender, System.EventArgs e) {         //创建原始窗体的实例          WebForm1 wf1;         //获得实例化的句柄          wf1=(WebForm1)Context.Handler;          Label1.Text=wf1.Name;          Label2.Text=wf1.EMail; }

运行,即可看到传递后的结果了。

这种方法 优缺点是:需要写一些额外的代码创建一些属性,但是它简洁清晰,并且是面向对象的。

四、Application

因为应用程序和它存储的所有对象可以同时由不同的线程访问,所以最好只将很少修改的数据与应用程序范围一起存储。理想情况是,对象在 Application_Start 事件中初始化,对它的进一步访问是只读的。 在下面的示例中,文件在 Application_Start(在 Global.asax 文件中定义)中读取,内容则以应用程序状态存储在 DataView 对象中。

void Application_Start() {       DataSet ds =new DataSet();       FileStream fs =new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);       StreamReader reader =new StreamReader(fs);       ds.ReadXml(reader);       fs.Close();       DataView view =new DataView(ds.Tables[0]);       Application["Source"] = view; }

在 Page_Load 方法中,DataView 随后被检索并用于填充 DataGrid 对象:

void Page_Load(Object sender, EventArgs e) {       DataView Source = (DataView)(Application["Source"]);       MyDataGrid.DataSource = Source; }

此解决方案的优点是只有第一个请求付出检索数据的代价。所有后面的请求则使用已有的 DataView 对象。由于数据自初始化后从不修改,所以不必为序列化访问做任何规定。

Application得使用一般是相对于整个项目来说相对静止的变量,比如数据库连接变量等。对于那些针对每一个用户,每一个会话未必一样得变量就不适用了。通常Application变量得值是在Config终指定。也可以在global.ascx中指定。

五、Cookie:

下面的示例说明如何使用客户端 Cookie 存储易失的用户首选项。 在客户端存储 Cookie 是 ASP.NET 的会话状态将请求与会话关联的方法之一。Cookie 也可以直接用于在请求之间保持数据,但数据随后将存储在客户端并随每个请求一起发送到服务器。浏览器对 Cookie 的大小有限制,因此,只有不超过 4096 字节才能保证被接受。 当数据存储在客户端时,文件 cookies1.aspx 中的 Page_Load 方法检查客户端是否已发送了 Cookie。如果没有,则创建并初始化一个新的 Cookie 并将其存储在客户端:

protectedvoid Page_Load(Object sender, EventArgs e) {      if (Request.Cookies["preferences1"] ==null)       {           HttpCookie cookie =new HttpCookie("preferences1");           cookie.Values.Add"ForeColor", "black");           Response.AppendCookie(cookie);       } }

在同一页上,再次使用 GetStyle 方法提供存储在 Cookie 中的个别值:

protected String GetStyle(String key) {     HttpCookie cookie = Request.Cookies["preferences1"];    if (cookie !=null)     {      switch (key)       {        case"ForeColor" :              return cookie.Values["ForeColor"];              break;        }         }        return""; }

若要使 Cookie 在会话之间持久,必须将 HttpCookie 类上的 Expires 属性设置为将来的某个日期。除了 Cookie.Expires 的赋值,下列自定义 .aspx 页上的代码与上一个示例相同:

protectedvoid Submit_Click(Object sender, EventArgs e) {       HttpCookie cookie =new HttpCookie("preferences2");       cookie.Values.Add("ForeColor",ForeColor.Value);       cookie.Expires = DateTime.MaxValue; // Never Expires       Response.AppendCookie(cookie);       Response.Redirect(State["Referer"].ToString()); }

Cookie作为一种提交,请求时保存数据得方式,又很明显的优缺点。他的缺点在上面有所表述,比如大小受限,不能保存对象等,另外,作为保存时间,也就 是数据得有效期来说,确是保存得最好的。我们可以通过设置cookie得过期时间等属性来设置。Cookie又很多常用属性,包括domain,path 等,这些资料可以在quickstart上获取到。

六、ViewState:

ASP.NET 为每个控件提供视图状态的服务器端注记。控件可以使用类 StateBag 的一个实例上的 ViewState 属性,在请求之间保存它的内部状态。StateBag 类提供词典样式的接口来存储与字符串键关联的对象。 文件 pagestate1.aspx 显示一个可见的面板并使用键 PanelIndex 在该页的视图状态下存储它的索引:

protectedvoid Next_Click(Object sender, EventArgs e ) {       String PrevPanelId ="Panel"+ ViewState["PanelIndex"].ToString();       ViewState["PanelIndex"] = (int)ViewState["PanelIndex"] +1;       String PanelId ="Panel"+ ViewState["PanelIndex"].ToString(); }

注意,如果在多个浏览器窗口中打开该页,每个浏览器窗口最初将显示此名称面板。每个窗口可以独立地在面板之间定位。 小结 1. 使用应用程序状态变量存储很少修改但经常使用的数据。 2. 使用会话状态变量存储特定于某个会话或用户的数据。数据全部存储在服务器上。这种方法适于短期的、大量的或敏感的数据。 3. 将少量易失数据存储在非持久性 Cookie 中。数据存储在客户端,在每次请求时发送到服务器,并在客户端结束执行时失效。 4. 将少量非易失数据存储在持久性 Cookie 中。数据存储在客户端直到失效,并在每次请求时发送到服务器。 5. 将少量请求特定的数据存储在视图状态中。数据从服务器发送到客户端并返回。

时间: 2024-10-05 04:37:38

ASP.NET三种传值方式的相关文章

三种传值方式遇上两个数的交换

最近在学习数据结构的时候发现以前学的C++的有些东西都忘了,特别是老师提到的三种传值的方式——单向值传递,地址传递,双向引用传递:为此,我这里用如何交换两个数的例子来说明一下三种传值方式的机制. 先看看源代码: 1 #include<iostream> 2 using namespace std; 3 int swap1(int m1,int m2)//单向值传递 4 { 5 int temp = m1; 6 m1 = m2; 7 m2 = temp; 8 cout<<m1<

django之创建第7-6-第三种传值方式

1.创建bar.html文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>time</title> </head> <body> <li>1.当前时间:{{today}}</li><br> <li>my id:{{id}}<

cookie 和 session的区别 &amp; 三种传值方式

1.session保存在服务器,客户端不知道其中的信息:cookie保存在客户端,服务器能够知道其中的信息. 2.session中保存的是对象,cookie中保存的是字符串. 3.session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到.而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的. 4.session以cookie为基础,session需要借助cookie才能正常工作,如果客户端完全禁止cookie

extjs三种传值方式

extjs三种传值方式: 1,params传值Ext.Ajax.request({   url : 'referfriend/getReferfriends',   method : 'GET',   params : {    customerId: rec.data['id']   },   success : function(response, opts) {    var data = Ext.JSON.decode(response.responseText);    this.ge

Activity之间的三种传值方式

*************************************** 第一种:Extras:额外的,附加的.在Intent中附加额外的消息 //传值 Intent intent = new Intent(this, XXXActivity.class); intent.putExtra(key, value); startActivity(intent); //取值 getIntent()方法得到intent对象 Intent intent = getIntent(); //获取Int

MVC页面常见的三种传值方式

前言最近在敲积分系统,发现有很多对象可以用来传值,今天就来总结一下常见的三种方式:ViewData.ViewBag和TempData 这三种方式用于Controller向View传值,一般情况下我们不会只传list,还会附带很多额外的零散的数据,这样通过model就无能为力了,这时候就会用到上文的三种对象 首先对比一下前两者——ViewData&ViewBag Controller里边的代码(ViewData): public ActionResult Index() { List<stri

MVC页面常见三种传值方式——ViewData,ViewBag,TempData

最近接触MVC代码多了,发现了很多新东西,比如页面传值.发现了MVC里面原来有这么多对象可以用来传值,最近两天用到了ViewData和ViewBag,之后又关联到了TempData,现在列个表格比较下: 用过之后,个人感觉还是ViewBag最好用,直接属性赋值就可以了,但是ViewData和TempData又有它们的优势,在使用的时候,可以根据要传递数据的大小,是从Controller向Views里面传递数据,还是Controller传递数据...综合考虑各种因素再做决定吧. 除了这三种比较常见

ASP.NET MVC程序传值方式:ViewData,ViewBag,TempData和Session

转载原地址 http://www.cnblogs.com/sunshineground/p/4350216.html 在ASP.NET MVC中,页面间Controller与View之间主要有以下几种小量数据的传值方式:ViewData.ViewBag.TempData和Session变量. 下面就这四种传值方式做出详细介绍. 一.ViewData ViewData是一个继承自ViewDataDictionary类的Dictionary对象,它只能存储String Key/Object Valu

NEt中MVC的View和Controller的几种传值方式

1: ViewData传值方式ViewData的生命周期和View相同, 只对当前View有效.   ViewData["zd"] = dfdfd2:TempData传值方式   可以跨Action传递   TempData的数据至多只能经过一次Controller传递, 并且每个元素至多只能被访问一次,     例如一个用法为,抛出一个异常.跳转到error页面public ActionResult Index3(){      TempData["tempIndex&qu