`

ASP.NET 2.0中实现跨页面提交

阅读更多

在ASP.NET 1.X 版本中,页面都是提交到自己本身,并不能方便的指定需要提交的目的页面。例如FirstPage.ASPx中的button只能提交到FirstPage.ASPx,而不能提交到SecondPage.ASPx。很多时候,ASP.NET 1.X这样工作方式使我们的开发方式受到不少限制。熟悉ASP/JSP/PHP的朋友大概很不习惯,因为以前经常使用的提交方式突然无法使用,虽然也有解决这个问题的方法(欲详细了解的读者可去微软网站收看webcast),可是过程太烦琐,不甚方便。令我们高兴的是,ASP.NET 2.0中有了跨页面提交的简单方法。

  简单的例子

  首先看看下面的代码,FirstPage.ASPx中的Button通过指定PostBackUrl属性可以提交到指定的页面:

  FirstPage.ASPx

<%@ Page Language="C#" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xHTML1/DTD/xHTML1-transitional.dtd">
<script runat="server">
public String UserName {
 get {
  return this.txtName.Text;
 }
}
protected void Button1_Click(object sender, EventArgs e)
{
 Label1.Text = "Postback from self. Your Name is: " txtName.Text;
}
</script>

<HTML XMLns="http://www.w3.org/1999/xHTML" >
<head runat="server">
 <meta content="text/JScript" http-equiv="content-script-type" />
 <title>First Page</title>
</head>
<body>
 <form id="form1" runat="server">
 <div>
  <h3>The Frist Page</h3>
  Your Name:
  <ASP:TextBox ID="txtName" runat="server" />
  <ASP:Label ID="Label1" runat="server" EnableViewState="False" /><br />
  <br />
  <ASP:Button ID="Button1" runat="server" Text="Postback to Same Page" OnClick="Button1_Click" /><br />
  <br />
  <ASP:Button ID="Button2" runat="server" Text="Postback to Second Page" PostBackUrl="~/SecondPage.ASPx" /><br />
 </div>
</form>
</body>
</HTML>
  SecondPage.ASPx

<%@ Page Language="C#" %>
<%@ PreviousPageType VirtualPath="~/FirstPage.ASPx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xHTML1/DTD/xHTML1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
 this.Label1.Text = "Your Name is : " PreviousPage.UserName;
}
</script>

<HTML XMLns="http://www.w3.org/1999/xHTML" >
<head runat="server">
<title>Second Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>This is the Second Page</h1>
<p><ASP:Label ID="Label1" runat="server"></ASP:Label> </p>
</div>
</form>
</body>
</HTML>
  打开FirstPage.ASPx,输入内容并按下"Postback to Second Page"按钮提交,页面就会提交到SecondPage.ASPx,输入的内容也会显示在SecondPage.ASPx上。注意FirstPage.ASPx中Button2新增的PostBackUrl属性,还有SecondPage.ASPx中的@PreviousPageType指令。这些新增的内容,正是ASP.NET 2.0 中的跨页提交的方案的组成部分。

  大家可能会发现,在使用ASP.NET 2.0 的跨页面提交功能的时候,目标页面都是在源页面的窗口中打开的。但有时候我们需要在新的窗口中打开目标页面,通过修改源页面中<form>的属性可以实现这一点。如下面的代码所示:

<form id="MainForm" Target="_blank" runat="server">读取源页面的信息

  ASP.NET 2.0中,Button控件有个新增的属性PostBackUrl,用来设置需要提交的目标页面。因为只要指定Button控件的PostBackUrl属性就可以提交到其它页面,我们可以在页面中使用多个控件配置其PostBackUrl的属性,提交到不同的页面。当然也可配置多个页面提交到同一个页面。

  在跨页面提交之后,通常我们需要从源页面中读取控件的信息(即由浏览器发送的信息),以及源页面的公共属性。

  读取控件的值

ASP.NET 2.0的Page类新增了一个PreviousPage属性。顾名思义,目标页面中的这个属性包含对源页面的引用。这样就可以在目标页面中通过PreviousPage属性访问源页面的信息,我们一般使用FindControl方法来查找源页面上的控件并读取这些控件的值。下面的代码说明了该方法的使用:

if (Page.PreviousPage != null)
{
 TextBox txtName = (TextBox)Page.PreviousPage.FindControl("txtName");
 if (txtName != null)
 {
  Label1.Text = txtName.Text;
 }
}
  当我们想查找源页面中控件属于另一个控件或者是模板之中,就不能直接使用FindControl方法来读取它,而是应该先获取对该容器的引用,然后才能在该容器中查找要获取的控件。下面的例子中,FirstPage.ASPx页面中包含一个Panel控件,其ID为MainPanel,它还包含ID为UserName的TextBox控件。具体代码如下:

Panel MainPanel = (Panel)PreviousPage.FindControl("MainPanel");
if (MainPanel != null)
{
 TextBox UserName = (TextBox)MainPanel.FindControl("UserName");
 if (UserName != null)
 {
  Label1.Text = UserName.Text;
 }
}
else
{
 Label1.Text = "Cannot find UserName control.";
}
  读取源页面的公共属性

  一旦在目标页面中获取了PreviousPage的引用,就能访问源页面中公共控件的属性,同样也可访问源页面中的公共属性。当然,我们需要预先在源页面中公开需要被访问的属性方可在目标页面中访问。

  若要获取源页面的公共成员,必须先获取对源页面的强类型引用。就像第一个例子中,我们可以使用@PreviousPageType指令来指定源页面,它有两个属性分别为:VirtualPath和TypeName。使用VirtualPath属性指定来源页的虚拟路径(包含文件名),也可以使用TypeName指定源页面的属性。注意只能指定其中的一个,两者都指定就会失效。如第一个例子中所示:

<%@ PreviousPageType VirtualPath="~/FirstPage.ASPx" %>
  如果使用了@PreviousPageType指令,目标页面中的PreviousPage 属性被强类型化为源页面的类。因此,可以直接引用源页面的公共成员。要获取对源页面的强类型引用的另一种方法是在目标页面中包含一个@Reference 指令,就像引用要在页面中使用的其它任何类型一样。在这种情况下,你可以在目标页面中获取目标页面的PreviousPage属性并将其强制转换为源页面的类型,如下面的代码所示:

SourcePage_ASPx sourcePage;
sourcePage = (SourcePage_ASPx) PreviousPage;
Label1.Text = sourcePage.UserName;
  读取源页面中的Form信息

  如果源页面和目标页面属于同一个 ASP.NET 应用程序,则目标页中的PreviousPage属性包含对源页面的引用。在没有使用@PreviousPageType指令的情况下,目标页面中PreviousPage 属性类型化为Page。

  注意,如果该页不是跨页发送的目标页面或者目标页面位于不同的应用程序中,则不会初始化PreviousPage属性。

  如果源页面和目标页面属于不同的应用程序,甚至是不同的网站,那就无法直接获取源页面上控件的值,但可以从Request.Form中读取发送的数据。还有一个需要注意的问题,因为源页面的视图状态经过Hash处理,所以不能从源页面中读取视图状态。如果要在源页面中存储值并让这些值可供其他应用程序中的目标页使用,可以将这些值作为字符串存储在源页面的隐藏字段中,并在目标页面中通过 Request.Form 来访问它们。
判断是否为跨页面提交

  跨页面提交的时候,源页面控件的内容被提交到目标页面,然后浏览器执行POST操作(注意,不是GET)。在ASP.NET 1.x中由于页面都是自己提交给自己,可以通过Page的IsPostBack属性来判断是否为页面提交。但是在跨页面提交的时候,目标页面的IsPostBack属性为false。如果要判断是否为跨页面提交,可以对目标页面的PreviousPage属性返回的引用页面的IsCrossPagePostBack属性进行判断,如下面的代码所示:

if(PreviousPage != null)
{
 if(PreviousPage.IsCrossPagePostBack == true)
{
  Label1.Text = "跨页面提交";
 }
}
else
{
 Label1.Text = "非跨页面提交";
}
  注意,如果当前页面不是跨页面提交的目标页面,则其PreviousPage属性为空。

  跨页面提交 VS Server.Transfer

  ASP.NET 2.0中,无论是跨页面提交还是使用Server.Transfer操作,都可以使用Previousoage属性来获取对源页面的引用。如果要区分它们,可以使用上面介绍的方法。

  下面是跨页面提交与Server.Transfer之间的一些区别:

属 性 跨页面提交 Server.Transfer IsPostBack false false PreviousPage 源页面的引用 源页面的引用 PreviousPage.IsCrossPagePostBack true false IsCrossPagePostBack false false IsCallBack false false
  跨页面提交是客户端浏览器的行为,而Server.Transfer则是服务器端的行为。在后面的小节中,我们会分析跨页面提交时客户端浏览器是如何实现提交的。

  对跨页面提交的简单分析

  在上面的例子中,我们都提到设置Button的PostBackUrl属性来实现跨页面提交。其实只要实现IButtonControl接口的控件均可以实现这一点。Button, ImageButton, 和 LinkButton都实现了IButtonControl接口。通过实现IButtonControl,自定义控件也可以有表单中的按钮所具有的跨页面提交的功能。IButtonControl接口聚合了ASP.NET 1.x支持的多数按钮控件(包括一些HTML按钮控件)的一些属性。

  当设置了Button控件的PostBackUrl属性之后,ASP.NET运行时将为按钮控件的所对应的的HTML元素绑定一段新的JavaScript代码。使用新的 WebForm_DoPostBackWithOptions函数取代常规以前所使用的__doPostback函数。具体的HTML代码示例如下:

<input type="submit" name="Button2" value="Postback to Second Page" onclick="JavaScript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("Button2", "", false, "", "SecondPage.ASPx", false, false))" id="Button2" />
  上述代码中的WebForm_DoPostBackWithOptions函数与WebForm_PostBackOptions函数的JavaScript代码如下:

function WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) {
this.eventTarget = eventTarget;
this.eventArgument = eventArgument;
this.validation = validation;
this.validationGroup = validationGroup;
this.actionUrl = actionUrl;
this.trackFocus = trackFocus;
this.clientSubmit = clientSubmit;
}

function WebForm_DoPostBackWithOptions(options) {
var validationResult = true;
if (options.validation) {
if (typeof(Page_ClientValidate) == 'function') {
validationResult = Page_ClientValidate(options.validationGroup);
}
}
if (validationResult) {
if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {
theForm.action = options.actionUrl;
}
if (options.trackFocus) {
var lastFocus = theForm.elements["__LASTFOCUS"];
if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {
if (typeof(document.activeElement) == "undefined") {
lastFocus.value = options.eventTarget;
}
else {
var active = document.activeElement;
if ((typeof(active) != "undefined") && (active != null)) {
if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {

lastFocus.value = active.id;
}
else if (typeof(active.name) != "undefined") {
lastFocus.value = active.name;
}
}
}
}
}
}
if (options.clientSubmit) {
__doPostBack(options.eventTarget, options.eventArgument);
}
}
  用户点击按钮时,当前表单将内容提交给PostPageUrl属性所指定的目标页面。当页面中含有可以实现跨页面提交功能的控件时,页面会创建一个name为__PREVIOUSPAGE的隐藏字段,此字段包含了源页面的信息。目标页面则使用此信息来创建一个完整状态的引用来调用源页面对象。上述隐藏字段的相关HTML代码示例如下:

<input type="hidden" name="__PREVIOUSPAGE" id="__PREVIOUSPAGE" value="ND3_1GqjDSUeAC3yLYVz-eQrkTzZLYFHliIFf7mMQVBdmwZmFi8HG4mzX5pfZY0n0" />
  总 结

  ASP.NET 2.0 新增的跨页面提交功能,让我们的开发过程有了更加灵活的选择。在使用跨页面提交的时候,我们要根据实际的情况选择合适的方式来读取源页面中的信息。如果源页面与目标页面处于同一个应用程序之内,我们可以选择使用@PreviousPageType指令来指定源页面,这样就可以使用强类型引用的好处。

  由于ASP.NET中的每个页面类所包含的子控件对应的是protected成员,所以您不能直接通过PreviousPage引用来访问源页面中的控件,而先需要将源页面中需要被访问的属性公开出来。同时,建议您只将需要的信息作为公共属性公开,以减少可能被潜在的恶意用户使用的信息。

分享到:
评论

相关推荐

    ASP.NET 2.0 中实现跨页面提交

    ASP.NET 2.0 中实现跨页面提交

    《零基础学ASP.NET 2.0》第1章 认识ASP.NET 2.0 1

    1.1 ASP.NET 2.0 是什么 1 1.2 第一个ASP.NET 2.0网站 2 1.2.1 创建网站 2 1.2.2 设计网站 3 1.2.3 通过预编译发布网站 5 1.3 ASP.NET 2.0必须具备的HTML知识 7 1.3.1 利用表单提交数据 8 1.3.2 使用表格进行布局 9 ...

    零基础学ASP.NET 2.0电子书&源代码绝对完整版1

    示例描述:本章学习ASP.NET 2.0页面基本对象。 4-01.aspx aspx页面中添加一个Lable标签。 4-02.aspx 读出Application的属性值。 4-03.aspx 读出SessionID的值。 4-04.aspx 创建Session对象。 4...

    ASP&C#教程\精通Asp.net2.0+Sql2005项目开发

    \MyElectCourse \teacherSubmitScore.aspx 教师提交成绩页面 \MyElectCourse \ModifyPwd.aspx 修改密码页面 第4章(\C04) 示例描述:本章实现了聊天室系统,功能包括用户登录、自动注册、用户发言、实时...

    零基础学ASP.NET 2.0&源代码绝对完整版1

    示例描述:本章学习ASP.NET 2.0页面基本对象。 4-01.aspx aspx页面中添加一个Lable标签。 4-02.aspx 读出Application的属性值。 4-03.aspx 读出SessionID的值。 4-04.aspx 创建Session对象。 4-05.aspx 读取...

    第6章 ASP.NET 2.0内置对象.ppt

    这些信息被提交到服务器,在服务器上重构页面。 对于get方式,服务器端用Request.QueryString获取变量的值(送的数据量较小 ,安全性低,效率高)。 对于post方式,服务器端用Request.Form获取提交的数据(传送的...

    PageOffice for ASP.NET 2.0 专业版

    PageOffice for ASP.NET是一款非常优秀的专业的集成微软OFFICE功能的ASP.NET控件平台,能够帮助Web开发人员轻松实现在网页中嵌入运行微软Office的特殊功能。PageOffice把微软复杂的Office编程接口(COM API) 有效地...

    IntelliGrid表格控件(Web Grid)V1.0 For Asp.Net2.0 3.5

    本控件是基于Asp.Net平台的Web表格控件,用于Web网站的开发。 ★支持多种浏览器(IE6以上、FireFox2.0以上、谷歌浏览器等)。 ★使用本控件开发的网站,网页上表格行的插入、追加、删除、修改、上下移动、拷贝、粘贴...

    asp.net知识库

    ASP.NET 2.0 中实现跨页提交 新控件、管理外观、布局及其它用户体验 ASP.NET 2.0 缓存技术 (原创) asp.net 2.0中的theme主题覆盖问题 asp.net 2.0中利用app_offline.htm功能 .NET 2.0中的字符串比较 小试ASP.NET ...

    IWMS网站管理系统asp.net

    采用微软 ASP.NET2.0(C#) 设计,使用分层设计模式,页面高速缓存,是迄今为止国内最先进的.NET语言企业网站管理系统。整套系统的设计构造,完全考虑大中小企业类网站的功能要求,网站的后台功能强大,管理简捷,...

    ASP.NET Ewebeditor 4.6 破解版

    ASP.NET 版Ewebeditor 4.6 完整破解版:这是网上别人破解的一个支持ASP.NET的ewebeditor 4.6 asp.net版的eWebEditor v4.6 完整破解版,带后台管理。 eWebEditor以其调用简单,使用方便,功能强大得到了广大用户的...

    asp.net实现取消页面表单内文本输入框Enter响应的方法

    后来google一下,发现这是asp.net2.0为表单处理专门设置的”Enter key”功能,关于asp.net ajax表单的enter key,你可以查看这一篇《ASP.NET基于Ajax的Enter键提交问题》。前面给出链接的两篇都是叫我们怎么设置...

    在ASP.NET 2.0中操作数据之二十一:实现开放式并发

     例如,假设两个用户,Jisun和Sam,都访问我们的应用软件中的一个页面,这个页面允许访问者通过一个GridView控件更新和删除产品数据。他们都同时点击GridView控件中的Edit按钮。Jisun把产品名称更改为“Chai Tea”...

    ASP.Net中表单POST到其他页面的方法分享

    @ Page EnableViewStateMac=”false” %>但这样做不是很安全,其实asp.net 2.0 还提供了一种方式提交到其他页面,服务器按钮控件提供了一个属性:PostBackUrl,这样写 代码如下:button1.PostBackU

    问答ASP.NET网站管理系统v5.1

    asp.net cms .net framework 2.0 language c# -------------------------------------------...系统要求: 支持ASP.NET,.net2.0/3.0/3.5/4.0 服务内容: 目前系统免费提供,欢迎您提出意见以便我们改进。 www.wdmir.net

    在线编辑office的神器PageOffice For ASP.NET

    PageOffice for ASP.NET是一款非常优秀的专业的集成微软OFFICE功能的ASP.NET控件平台,能够帮助Web开发人员轻松实现在网页中嵌入运行微软Office的特殊功能。PageOffice把微软复杂的Office编程接口(COM API) 有效地...

    基于AJAX技术的邮件系统

    浏览器不需要将整个页面提交到服务器,就能够实现页面的部分更新。并且在这一个与服务器交互过程中,用户不会感觉到页面被刷新。微软公司在ASP.NET 2.0之上也推出了AJAX技术,即ASP.NET AJAX技术。本章将介绍创建一...

    ASP.NET微信公众号平台系统源码

    2、对于开发者而言这套后台系统UI也是非常不错的一款,在二次开发扩展的时候只要将自己做的页面指向到对应的链接即可,权限可自行开发,购买者可根据自身业务完成后续开发即可。 3、此系统对微信接口实现了细致的...

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    本讲将通过实例比较ASP.NET下的三种典型URL重写方案——ISAPI重写(使用开源组件IIRF),ASP.NET2.0内置的urlMappings和基于自定义HTTPModule的URL重写(使用NBear.Web中的UrlRewriteModule实现),并探讨URL重写中...

Global site tag (gtag.js) - Google Analytics