1. 使用QueryString变量 QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子: a.aspx的C#代码 private void Button1_Click(object sender, System.EventArgs e) { string s_url; s_url = "b.aspx?name=" + Label1.Text; Response.Redirect(s_url); } b.aspx中C#代码 private void Page_Load(object sender, EventArgs e) { Label2.Text = Request.QueryString["name"]; } 2. 使用Application 对象变量 Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。 a.aspx的C#代码 private void Button1_Click(object sender, System.EventArgs e) { Application["name"] = Label1.Text; Server.Transfer("b.aspx"); } b.aspx中C#代码 private void Page_Load(object sender, EventArgs e) { string name; Application.Lock(); name = Application["name"].ToString(); Application.UnLock(); } 3. 使用Session变量 想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。 a.aspx的C#代码 private void Button1_Click(object sender, System.EventArgs e) { Session["name"] = Label.Text; } b.aspx中C#代码 private void Page_Load(object sender, EventArgs e) { string name; name = Session["name"].ToString(); } 4. 使用Cookie对象变量 这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。 a.aspx的C#代码 private void Button1_Click(object sender, System.EventArgs e) { HttpCookie cookie_name = new HttpCookie("name"); cookie_name.Value = Label1.Text; Reponse.AppendCookie(cookie_name); Server.Transfer("b.aspx"); } b.aspx中C#代码 private void Page_Load(object sender, EventArgs e) { string name; name = Request.Cookie["name"].Value.ToString(); } 5. 使用Server.Transfer方法 这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。 a.aspx的C#代码 public string Name { get{ return Label1.Text;} } private void Button1_Click(object sender, System.EventArgs e) { Server.Transfer("b.aspx"); } b.aspx中C#代码 private void Page_Load(object sender, EventArgs e) { a newWeb; //实例a窗体 newWeb = (source)Context.Handler; string name; name = newWeb.Name; } |
之二:
ASP.NET WEB FORMS 给开发者提供了事件驱动开发模式。然而这种简单的应用程序开发模式却给我们带来了一些小问题,举个例子,在传统的ASP应用程序中,你能够通过POST方法很容易的把一个值或多个值从一个页面传送到另一个页面,用同样的方法在ASP.NET中实现有点麻烦。在这里,我们可以通过其他方式来解决这种情形。ASP.NET为我们提供了三种方式,一种是可以通过用QueryString来传送相应的值,再一种是通过session变量来传送相应的值,还有就是通过Server.Transfer方法来实现。下面分别一一介绍:
一、使用Querystring Querystring是一种非常简单的传值方式,其缺点就是会把要传送的值显示在浏览器的地址栏中,并且在此方法中不能够传递对象。如果你想传递一个安全性不是那么太重要或者是一个简单的数值时,用此方法最好不过了。下面通过一个小例子来完成传值工作,步骤如下: 1、创建一个web form 2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 3、为button按钮创建click事件 代码如下: private void 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中添加如下代码: private void Page_Load (object sender, System.EventArgs e) { Label1.Text=Request.QueryString["name"]; Label2.Text=Request.QueryString["email"]; } 运行,即可看到传递后的结果了。
这种方法得缺点是: 1:一般来说这种方法通常使用来传递明码参数,也就是不需要保密得参数,同时在使用querystring传值得时候不能传递对象,参数的长度不能大于1024字节(?),当参数中有中文得时候,通常需要使用HttpUlitity.UrlEncode方法来对参数进行编码和解吗。
二、使用Session变量
使用Session变量传值是一种最常见的方式了,此中方式不仅可以把值传递到下一个页面,还可以交叉传递到多个页面,直至把Session变量的值removed后,变量才会消失。举个例子看看: 1、创建一个web form 2、在新建的web form中放置一个button1,在放置两个TextBox1,TextBox2 3、为button按钮创建click事件 代码如下: private void 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中添加如下代码: private void 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事件 代码如下: private void Button1_Click (object sender, System.EventArgs e) { Server.Transfer("webform2.aspx"); } 4、创建过程来返回TextBox1,TextBox2控件的值代码如下: public string Name { get { return TextBox1.Text; } }
public string EMail { get { return TextBox2.Text; } } 5、新建一个目标页面命名为webform2 6、在webform2中放置两个Label1,Label2 在webform2的Page_Load中添加如下代码: private void Page_Load (object sender, System.EventArgs e) { //创建原始窗体的实例 WebForm1 wf1; //获得实例化的句柄 wf1=(WebForm1)Context.Handler; Label1.Text=wf1.Name; Label2.Text=wf1.EMail;
} 运行,即可看到传递后的结果了。
这种方法没有使用过,不能做出评价。
4,其他传值的方法
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 并将其存储在客户端: protected void 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 页上的代码与上一个示例相同: protected void 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 在该页的视图状态下存储它的索引: protected void 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. 将少量请求特定的数据存储在视图状态中。数据从服务器发送到客户端并返回。
========================补充===================================
C#全局变量的设置和读取方法
方法一:web.config文件 ——设置: 在web.config文件里添加关键字key是通过<appSettings>标记来实现的,但是appSettings标记通常放在<system.web>.....</system.web>标记外面。例: <configration> <appSettings> <add key="connString1" value="server=localhost;user id=sa;pwd=;database=数据库名字"/> <add key="connString2" value="provider=Microsoft.Jet.OleDb.4.0;Data Source=数据库路径"/> </appSettings> <system.web> </system.web> </configration>
——读取: 要在代码中引用这些数据库连接字符串,需要先添加对System.ConFiguration名字空间的引用,在这个名字空间中含有ConfigurationSettings类,其静态方法ConfigurationSettings.AppSettings属性可获取web.config文件中<appSettings>节的设置,读到的值为string型。例如:
using System.Configuration; string conn1 = ConfigurationSettings.AppSettings["connString1"]; string conn2 = ConfigurationSettings.AppSettings["connString2"]; SQLConnection myConn1 = new SQLConnection(conn1); OleDbConnection myConn2 = new OleDbConnection(conn2);
在VS2005中, ConfigurationSettings.AppSettings 可以换成 ConfigurationManager.AppSettings
方法二:Gloab文件 ——设置: 在Global文件里中添加 protected void Session_Start(Object sender, EventArgs e) { Session["sqlConnectionString"] = "uid=Username;pwd=password;database=MyTest;server=Localhost;Connect Timeout=300"; }
——读取: 在代码中的应用: String strConnection=Session["sqlConnectionString"].ToString(); sqlConnection_1=new SqlConnection(strConnection);