aspx.net 页面传值

★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 = (a)Context.Handler;
 string name;
 name = newWeb.Name;
}

★首先来看HttpContext类:
System.Web.HttpContext类继承自System.Object,按类名来理解,即是Http上下文类.

此类封装了有关单个HTTP 请求的所有HTTP 特定的信息。此类为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 Request、Response 和 Server 对象的访问。

HttpContext类的常用公共属性有:
Application,为当前 HTTP 请求获取HttpApplicationState 对象。
Current, 为当前 HTTP 请求获取 HttpContext 对象。
Handler, 为当前 HTTP 请求获取或设置 IHttpHandler 对象。
Items,获取可用于在 HTTP 请求过程中在 IHttpModule 和 IHttpHandler 之间组织和共享数据的键值集合。
Request,为当前 HTTP 请求获取 HttpRequest 对象。
Response,为当前 HTTP 响应获取 HttpResponse 对象。
Server, 获取提供用于处理 Web 请求的方法的 HttpServerUtility 对象。
Session, 为当前 HTTP 请求获取 HttpSessionState 实例。

通过Page类的Context属性可以获得当前的System.Web.HttpContext对象


接着来看Server.Transer()方法:
通过Page类的Server属性类可以Transfer到另一个页面,如Server.Transfer("NewPage.aspx"),可以跳转到新页面中,
使用Server.Transfer()跳转页面,客户端的URL并不会改变,只是在服务器端执行新页并输出,因此可以在新页面中通过获取来获得请求页面传递的对象和表单数据及查询字符串.

假定当前页面为FormerPage.aspx(类名为FormerPage), 跳转到的新页面为NewPage.aspx
从FormerPage.aspx跳转的代码如下:
private void btnToNewPage_Click(object sender, System.EventArgs e)
{
ArrayList list = new ArrayList(3);
list.Add("This list ");
list.Add("is for ");
list.Add("FormerPage to see.");

Context.Items["FormerPageList1"] = list;

Server.Transfer("NewPage.aspx");
}


在新页面(NewPage.aspx)Page_Load()事件中通过如下代码获得传递的数据:

if(!IsPostBack)
{
try
{
FormerPage former = (FormerPage)Context.Handler;
txtFromParentPage.Text = former.ClassName; //获取FormerPage中定义的ClassName公共属性

//获取在FormerPage中的上下文字典中添加的ArrayList: Context.Items["FormerPageList1"]
//获取Contex字典项并强制转换类型:
ArrayList list = Context.Items["FormerPageList1"] as ArrayList;

DataSet ds = former.GetDataSet(); //调用FormerPage中定义的GetDataSet()公共方法
DataGrid1.DataSource = ds;
DataGrid1.DataBind();
}
catch
{
Response.Write("Error get data from parent transfer page!");
}

}


注意上面通过Context.Hander属性来获取当前Http请求的IHttpHander对象,并强制转换成FormerPage对象:
FormerPage former = (FormerPage)Context.Handler;

后面可以直接调用这个类的公共属性,方法.同时可以调用在FormerPage中添加的Context字典项(Dictionary Item).

值得注意的是,使用Server.Transer传递页面数据,并使用Context.Handler来接收数据,只有在页面首次加载时,才可以正确获取上一页面的实例,而在postback时,获取的就会是当前页面的实例.

比如在NewPage.aspx中,首次加载时可以获取FomerPage对象,而在回发时尝试获取FormerPage会抛出异常,因为回发时,请求页面已经发生改变,不再是FormerPage发出的请求,而是自身NewPage发出的请求.我们可以在Page_Load()中加入如下代码判断 Http 请求是由哪个页面发出的:
string path = Context.Request.Path;
Response.Write("<script>alert('Request from:" + path + "');</script>");


另外,Server.Transer()有一个重载的方法Server.Trasfer(string newpage,bool preserveForm), 第二个参数用来指定是否保留HttpRequest.Form和HttpRequest.QueryString集合,若为true, 则原页面的Form和QueryString在新的页面中依然有效,可以被调用. 如:
string str = "Value of Textbox:"+Request.Form["TextBox1"] +"<br>";

你可能感兴趣的:(object,String,session,C#,application,button)