`
webcode
  • 浏览: 6076507 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

一个大家不常用到,却很有用的页面间传值方法(Context.Handler)

 
阅读更多

一、目前在ASP.NET中页面传值共有这么几种方式:
1、表单提交,
<form action= "target.aspx" method = "post" name = "form1">
<input name = "param1" value = "1111"/>
<input name = "param2" value = "2222"/>
</form>
....
form1.submit();
....
此种方在ASP。NET中无效,因为ASP。NET的表单总是提交到自身页面,如果要提交到别一页面,需要特殊处理。
2、<A href="target.aspx?param1=1111&param2=2222">链接地址传送</A>
接收页面: string str = Request["param1"]
3、Session共享
发送页面:Session("param1") = "1111";
按收页面 string str = Session("param1").ToString();
4、Application共享
发送页面: Application("param1") = "1111";
按收页面: string str = Application("param1").ToString();
此种方法不常使用,因为Application在一个应用程序域范围共享,所有用户可以改变及设置其值,故只应用计数器等需要全局变量的地方。
5、Cookie
6、Response.Redirect()方式
Response.Redirect("target.aspx?param1=1111&param2=2222")
接收页面: string str = Request["param1"]
7、Server.Transfer()方式。
Server.Transfer("target.aspx?param1=1111&param2=2222")
接收页面: string str = Request["param1"]

二、如果在两个页面间需要大量的参数要传传递,如数据查询等页面时,用1 - 6的方法传值及其不便,而第 7 种方法确有一独特的优势!但使用该方法时需要一定的设置,现简单介绍一下该方法的使用方式:
以查询数据页面为例:
在查询页面中设置如下公有属性(QueryPage.aspx):

publicclassQueryPage:System.Web.UI.Page
...{
protectedSystem.Web.UI.WebControls.TextBoxtxtStaDate;
protectedSystem.Web.UI.WebControls.TextBoxtxtEndDate;
...
/**////<summary>
///开始时间
///</summary>

publicstringStaDate
...{
get...{returnthis.txtStaDate.Text;}
set...{this.txtStaDate.Text=value;}
}

/**////<summary>
///结束时间
///</summary>

publicstringEndDate
...{
get...{returnthis.txtEndDate.Text;}
set...{this.txtEndDate.Text=value;}
}

....
privatevoidbtnEnter_Click(objectsender,System.EventArgse)
...{
Server.Transfer(
"ResultPage.aspx");//注意:使用ResultPage.aspx来接收传递过来的参数
}

}



在显示查询结果页面(ResultPage.aspx):

publicclassResultPage:System.Web.UI.Page
...{
privatevoidPage_Load(objectsender,System.EventArgse)
...{

//转换一下即可获得前一页面中输入的数据
QueryPagequeryPage=(QueryPage)Context.Handler;//注意:引用页面句柄

Response.Write(
"StaDate:");
Response.Write(queryPage.StaDate);
Response.Write(
"<br/>EndDate:");
Response.Write(queryPage.EndDate);
}

}


三、如果有许多查询页面共用一个结果页面的设置方法:
在这种方式中关键在于“ QueryPage queryPage = ( QueryPage )Context.Handler; ”的转换,只有转换不依赖于特定的页面时即可实现。
如果让所有的查询页面都继承一个接口,在该接口中定义一个方法,该方法的唯一作用就是让结果页面获得构建结果时所需的参数,就可实现多页面共享一个结果页面操作!

1、先定义一个类,用该类放置所有查询参数:(*.cs)

/**////<summary>
///结果页面中要用到的值
///</summary>

publicclassQueryParams
...{
privatestringstaDate;
privatestringendDate;

/**////<summary>
///开始时间
///</summary>

publicstringStaDate
...{
get...{returnthis.staDate;}
set...{this.staDate=value;}
}

/**////<summary>
///结束时间
///</summary>

publicstringEndDate
...{
get...{returnthis.endDate;}
set...{this.endDate=value;}
}

}



2、接口定义:

/**////<summary>
///定义查询接口。
///</summary>

publicinterfaceIQueryParams
...{
/**////<summary>
///参数
///</summary>

QueryParamsParameters...{get;}
}


3、查询页面继承IQueryParams接口(QueryPage.aspx):

/**////<summary>
///查询页面,继承接口
///</summary>

publicclassQueryPage:System.Web.UI.Page,IQueryParams
...{
protectedSystem.Web.UI.WebControls.TextBoxtxtStaDate;
protectedSystem.Web.UI.WebControls.TextBoxtxtEndDate;

privateQueryParamsqueryParams;
...
/**////<summary>
///结果页面用到的参数
///</summary>

publicQueryParamsParameters
...{
get
...{
returnqueryParams;
}

}

....
privatevoidbtnEnter_Click(objectsender,System.EventArgse)
...{
//赋值
queryParams=newQueryParams();
queryParams.StaDate
=this.txtStaDate.Text;
queryParams.EndDate
=this.txtEndDate.Text

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

}


4、别外的页面也如此设置
5、接收页面(ResultPage.aspx):

publicclassResultPage:System.Web.UI.Page
...{
privatevoidPage_Load(objectsender,System.EventArgse)
...{

QueryParamsqueryParams
=newQueryParams();
IQueryParamsqueryInterface;
//实现该接口的页面
if(Context.HandlerisIQueryParams)
...{
queryInterface
=(IQueryParams)Context.Handler;
queryParams
=queryInterface.Parameters;
}


Response.Write(
"StaDate:");
Response.Write(queryParams.StaDate);
Response.Write(
"<br/>EndDate:");
Response.Write(queryParams.EndDate);
}

}




三、本文起因:
因在工作中要作一个数据查询,参数烦多,原先是用Session传递,用完该Session传来的参数后,还需清理Session,在用Session之前还得判断该Session是否存在,极其烦琐,我想应该还有更简便的方法来实现页面间的参数传递,故上网查找,终于找到这样一种方式来实现页面间的参数传递。
有不到之处,请大家指正!
==================================================================================

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

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

HttpContext类的常用公共属性有:
Application,为当前 HTTP 请求获取HttpApplicationState 对象。
Current, 为当前 HTTP 请求获取 HttpContext 对象。
Handler, 为当前 HTTP 请求获取或设置 IHttpHandler 对象。
Items,获取可用于在 HTTP 请求过程中在 IHttpModuleIHttpHandler 之间组织和共享数据的键值集合。
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跳转的代码如下:

privatevoidbtnToNewPage_Click(objectsender,System.EventArgse)
{
ArrayListlist
=newArrayList(3);
list.Add(
"Thislist");
list.Add(
"isfor");
list.Add(
"FormerPagetosee.");

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;

DataSetds=former.GetDataSet(); //调用FormerPage中定义的GetDataSet()公共方法
DataGrid1.DataSource
=ds;
DataGrid1.DataBind();
}

catch
{
Response.Write(
"Errorgetdatafromparenttransferpage!");
}


}


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

FormerPageformer=(FormerPage)Context.Handler;

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

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

比如在NewPage.aspx中,首次加载时可以获取FomerPage对象,而在回发时尝试获取FormerPage会抛出异常,因为回发时,请求页面已经发生改变,不再是FormerPage发出的请求,而是自身NewPage发出的请求.我们可以在Page_Load()中加入如下代码判断Http请求是由哪个页面发出的:

stringpath=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在新的页面中依然有效,可以被调用. 如:

stringstr="ValueofTextbox:"+Request.Form["TextBox1"]+"<br>";



分享到:
评论

相关推荐

    页面传值---ASP.NET之5种全局变量!页面间传值方法!.

    **Cookie** 也是一种常用的页面传值方式,它可以存储在客户端的浏览器上,适用于需要在不同页面间持久化存储少量数据的情况。 - **示例代码:** - 在`a.aspx`页面中设置: ```csharp private void Button1_Click...

    net(c#)跨页面传值方法总结.docx

    在.NET (C#)开发中,跨页面传值是一个常见的需求,尤其是在Web Form应用程序中。以下是对几种常用方法的详细解释: 1. **引用页面对象(Reference Page)**: 这种方法允许你在接收页面中直接访问源页面的对象属性...

    页面之间传值的几种方式.txt

    本文将详细介绍几种常用的页面间传值方法:QueryString、Session以及Server.Transfer,并提供具体的实现示例。 #### 一、QueryString **QueryString**是一种非常简单的页面间传值方式,它通过URL中的问号(?)后添加...

    asp.net页面间的传值汇总

    ### ASP.NET 页面间传值详解 在ASP.NET开发中,页面间的数据传递是构建动态、交互式应用的关键技术之一。本文将对几种常见的ASP.NET页面间传值方式进行深入解析,包括GET、POST、页面对象属性及Cookie,旨在帮助...

    ASP.NET 页面间传值的几种方法

    Server.Transfer 方法可以说是面象对象开发所使用的方法,其使用 Server.Transfer 方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。 例如,在 ...

    5种页面传值方法

    ### 五种页面传值方法详解 在Web开发过程中,页面之间的数据传递是十分常见的需求。根据提供的文件信息,本文将详细介绍五种常用的页面传值方法:QueryString、Application、Session、Cookie以及Server.Transfer。 ...

    解析6种ASP.NET跨页面传值的方法

    ### 解析6种ASP.NET跨页面传值的方法 在ASP.NET开发中,跨页面传值是经常遇到的一个问题。为了确保用户体验良好且程序逻辑清晰,开发者需要掌握多种跨页面传值的技术。本文将详细介绍六种常用的ASP.NET跨页面传值...

    ASP.NET中页面传值的几种方法

    ### ASP.NET中页面传值的几种方法 在ASP.NET开发中,页面间的传值是非常重要的一个环节,这对于实现用户交互、数据处理等功能至关重要。本文将详细介绍ASP.NET中常见的几种页面传值方法,并对其进行深入解析。 ###...

    ASP.NET页面间的传值的几种方法(总结)

    ### ASP.NET 页面间的传值的几种方法(详细总结) 在ASP.NET开发中,页面间传值是一项非常重要的技能。为了确保应用程序的连贯性和用户体验,掌握多种传递数据的方法至关重要。本文将详细介绍几种常用的ASP.NET页面...

    在ASP页面中几种页面传值

    本文将详细介绍在ASP.NET页面中常用的几种页面传值方法,包括QueryString、Application对象、Session变量、Cookie对象以及Server.Transfer方法。 ### 1. 使用QueryString变量 **定义:** QueryString是一种通过URL...

    ASP.NET跨页面传值技巧.

    ### ASP.NET跨页面传值技巧详解 #### 一、引言 在ASP.NET应用程序开发过程中,经常需要在不同页面之间传递数据。为了提高程序的健壮性和灵活性,掌握多种跨页面传值技巧是非常必要的。本文将详细介绍五种常用的数据...

    ASP.net跨页面传值方式

    Server.Transfer方法是另一种常用的跨页面传值方法,它可以将请求从当前页面无缝地转移到另一个页面,同时保持当前请求的状态。 **优缺点:** - **优点:** - 无缝转移,不会造成页面刷新。 - 可以保持当前请求的...

    asp.net页面传值

    本文将根据给定的文件内容,详细介绍几种常用的页面传值方法:使用`QueryString`、使用`Session`对象以及使用`Server.Transfer`。 #### 一、使用`QueryString` **概述** 使用`QueryString`是一种通过URL参数来传递...

    ASP.NET中页面传值的几种方法收藏

    根据提供的文件信息,本文将详细介绍ASP.NET中常用的几种页面传值方法,并对每种方法进行深入解析,帮助开发者更好地理解和应用这些技术。 ### 1. 使用表单提交 (Form Post) 这是最传统的页面传值方式之一,通过`...

    C# 跨页传值

    这是一种非常常用的跨页传值方法,它通过URL传递参数到下一个页面。在发送页面中,可以设置参数并进行页面跳转: ```csharp public int sum = 0; int i = int.Parse(this.TextBox1.Text) * 2; Server.Transfer(...

    ASP.net页面传值

    ### ASP.NET 页面传值方法详解 #### 一、概述 在 ASP.NET 开发过程中,页面之间的数据传递是一项基本且重要的任务。本篇文章将详细介绍三种常用的数据传递方式:使用 QueryString、Session 变量以及 Server....

    ASP.NET跨页面传值技巧

    根据提供的文件信息,本文将详细介绍五种常用的跨页面传值方法:QueryString、Application、Session、Cookie以及Server.Transfer。 #### 一、QueryString **定义与应用场景**: - QueryString是一种简单直观的数据...

    一起学习动态网页的传值方法

    在网页开发过程中,数据传递是十分关键的一个环节,尤其是在动态网页中,如何高效、安全地进行页面间的参数传递是每个开发者都需要掌握的重要技能。本文将根据提供的资料,详细介绍ASP.NET中常用的几种传值方式,并...

    android学习笔记

    最常用的方法之一是使用`AlertDialog.Builder`来创建一个提示框。例如: ```java AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("这是一个测试提示...

Global site tag (gtag.js) - Google Analytics