仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 979|回复: 9
打印 上一主题 下一主题

[学习教程] ASP.NET网站制作之ASP.NET 2.0中完成跨页面提交

[复制链接]
只想知道 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:35:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
java的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。asp.net|页面  在ASP.NET1.X版本中,页面都是提交到本人自己,其实不能便利的指定必要提交的目标页面。比方FirstPage.aspx中的button只能提交到FirstPage.aspx,而不克不及提交到SecondPage.aspx。良多时分,ASP.NET1.X如许事情体例使我们的开辟体例遭到很多限定。熟习ASP/JSP/PHP的伴侣也许很不习气,由于之前常常利用的提交体例俄然没法利用,固然也有办理这个成绩的办法(演示Webcast),但是历程太啰嗦,不甚便利。令我们乐意的是,ASP.NET2.0中有了跨页面提交的复杂办法。

  复杂的例子

  起首看看上面的代码,FirstPage.aspx中的Button经由过程指定PostBackUrl属性能够提交到指定的页面:

  FirstPage.aspx

<%@PageLanguage="C#"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<scriptrunat="server">
publicStringUserName{
 get{
  returnthis.txtName.Text;
 }
}
protectedvoidButton1_Click(objectsender,EventArgse)
{
 Label1.Text="Postbackfromself.YourNameis:"+txtName.Text;
}
</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
 <metacontent="text/JScript"http-equiv="content-script-type"/>
 <title>FirstPage</title>
</head>
<body>
 <formid="form1"runat="server">
 <div>
  <h3>TheFristPage</h3>
  YourName:
  <asp:TextBoxID="txtName"runat="server"/>
  <asp:LabelID="Label1"runat="server"EnableViewState="False"/><br/>
  <br/>
  <asp:ButtonID="Button1"runat="server"Text="PostbacktoSamePage"/><br/>
  <br/>
  <asp:ButtonID="Button2"runat="server"Text="PostbacktoSecondPage"PostBackUrl="~/SecondPage.aspx"/><br/>
 </div>
</form>
</body>
</html>
  SecondPage.aspx

<%@PageLanguage="C#"%>
<%@PreviousPageTypeVirtualPath="~/FirstPage.aspx"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<scriptrunat="server">
protectedvoidPage_Load(objectsender,EventArgse)
{
 this.Label1.Text="YourNameis:"+PreviousPage.UserName;
}
</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>SecondPage</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<h1>ThisistheSecondPage</h1>
<p><asp:LabelID="Label1"runat="server"></asp:Label></p>
</div>
</form>
</body>
</html>
  翻开FirstPage.aspx,输出内容并按下"PostbacktoSecondPage"按钮提交,页面就会提交到SecondPage.aspx,输出的内容也会显现在SecondPage.aspx上。注重FirstPage.aspx中Button2新增的PostBackUrl属性,另有SecondPage.aspx中的@PreviousPageType指令。这些新增的内容,恰是ASP.NET2.0中的跨页提交的计划的构成部分。

  人人大概会发明,在利用ASP.NET2.0的跨页面提交功效的时分,方针页面都是在源页面的窗口中翻开的。但偶然候我们必要在新的窗口中翻开方针页面,经由过程修正源页面中<form>的属性能够完成这一点。以下面的代码所示:

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

  ASP.NET2.0中,Button控件有个新增的属性PostBackUrl,用来设置必要提交的方针页面。由于只需指定Button控件的PostBackUrl属性就能够提交到别的页面,我们能够在页面中利用多个控件设置其PostBackUrl的属性,提交到分歧的页面。固然也可设置多个页面提交到统一个页面。

  在跨页面提交以后,一般我们必要从源页面中读取控件的信息(即由扫瞄器发送的信息),和源页面的大众属性。

  读取控件的值

  ASP.NET2.0的Page类新增了一个PreviousPage属性。望文生义,方针页面中的这个属性包括对源页面的援用。如许就能够在方针页面中经由过程PreviousPage属性会见源页面的信息,我们一样平常利用FindControl办法来查找源页面上的控件并读取这些控件的值。上面的代码申明了该办法的利用:

if(Page.PreviousPage!=null)
{
 TextBoxtxtName=(TextBox)Page.PreviousPage.FindControl("txtName");
 if(txtName!=null)
 {
  Label1.Text=txtName.Text;
 }
}
  当我们想查找源页面中控件属于另外一个控件大概是模板当中,就不克不及间接利用FindControl办法来读取它,而是应当先猎取对该容器的援用,然后才干在该容器中查找要猎取的控件。上面的例子中,FirstPage.aspx页面中包括一个Panel控件,其ID为MainPanel,它还包括ID为UserName的TextBox控件。详细代码以下:

PanelMainPanel=(Panel)PreviousPage.FindControl("MainPanel");
if(MainPanel!=null)
{
 TextBoxUserName=(TextBox)MainPanel.FindControl("UserName");
 if(UserName!=null)
 {
  Label1.Text=UserName.Text;
 }
}
else
{
 Label1.Text="CannotfindUserNamecontrol.";
}
  读取源页面的大众属性

  一旦在方针页面中猎取了PreviousPage的援用,就可以会见源页面中大众控件的属性,一样也可会见源页面中的大众属性。固然,我们必要事后在源页面中公然必要被会见的属性方可在方针页面中会见。

  若要猎取源页面的大众成员,必需先猎取对源页面的强范例援用。就像第一个例子中,我们可使用@PreviousPageType指令来指定源页面,它有两个属性分离为:VirtualPath和TypeName。利用VirtualPath属性指定来历页的假造路径(包括文件名),也能够利用TypeName指定源页面的属性。注重只能指定个中的一个,二者都指定就会生效。如第一个例子中所示:

<%@PreviousPageTypeVirtualPath="~/FirstPage.aspx"%>
  假如利用了@PreviousPageType指令,方针页面中的PreviousPage属性被强范例化为源页面的类。因而,能够间接援用源页面的大众成员。要猎取对源页面的强范例援用的另外一种办法是在方针页面中包括一个@Reference指令,就像援用要在页面中利用的别的任何范例一样。在这类情形下,你能够在方针页面中猎取方针页面的PreviousPage属性并将其强迫转换为源页面的范例,以下面的代码所示:

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

  假如源页面和方针页面属于统一个ASP.NET使用程序,则方针页中的PreviousPage属性包括对源页面的援用。在没有利用@PreviousPageType指令的情形下,方针页面中PreviousPage属性范例化为Page。

  注重,假如该页不是跨页发送的方针页面大概方针页面位于分歧的使用程序中,则不会初始化PreviousPage属性。

  假如源页面和方针页面属于分歧的使用程序,乃至是分歧的网站,那就没法间接猎取源页面上控件的值,但能够从Request.Form中读取发送的数据。另有一个必要注重的成绩,由于源页面的视图形态经由Hash处置,以是不克不及从源页面中读取视图形态。假如要在源页面中存储值并让这些值可供其他使用程序中的方针页利用,能够将这些值作为字符串存储在源页面的埋没字段中,并在方针页面中经由过程Request.Form来会见它们。
<P>  判别是不是为跨页面提交

  跨页面提交的时分,源页面控件的内容被提交到方针页面,然后扫瞄器实行POST操纵(注重,不是GET)。在ASP.NET1.x中因为页面都是本人提交给本人,能够经由过程Page的IsPostBack属性来判别是不是为页面提交。可是在跨页面提交的时分,方针页面的IsPostBack属性为false。假如要判别是不是为跨页面提交,能够对方针页面的PreviousPage属性前往的援用页面的IsCrossPagePostBack属性举行判别,以下面的代码所示:

if(PreviousPage!=null)
{
 if(PreviousPage.IsCrossPagePostBack==true)
 {
  Label1.Text="跨页面提交";
 }
}
else
{
 Label1.Text="非跨页面提交";
}
  注重,假如以后页面不是跨页面提交的方针页面,则其PreviousPage属性为空。

  跨页面提交VSServer.Transfer

  ASP.NET2.0中,不管是跨页面提交仍是利用Server.Transfer操纵,都可使用Previousoage属性来猎取对源页面的援用。假如要辨别它们,可使用下面先容的办法。

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

属性跨页面提交Server.TransferIsPostBackfalsefalsePreviousPage源页面的援用源页面的援用PreviousPage.IsCrossPagePostBacktruefalseIsCrossPagePostBackfalsefalseIsCallBackfalsefalse
  跨页面提交是客户端扫瞄器的举动,而Server.Transfer则是服务器真个举动。在前面的大节中,我们会剖析跨页面提交时客户端扫瞄器是怎样完成提交的。

  对跨页面提交的复杂剖析

  在下面的例子中,我们都提到设置Button的PostBackUrl属性来完成跨页面提交。实在只需完成IButtonControl接口的控件都可以完成这一点。Button,ImageButton,和LinkButton都完成了IButtonControl接口。经由过程完成IButtonControl,自界说控件也能够有表单中的按钮所具有的跨页面提交的功效。IButtonControl接口聚合了ASP.NET1.x撑持的多半按钮控件(包含一些html按钮控件)的一些属性。

  当设置了Button控件的PostBackUrl属性以后,ASP.NET运转时将为按钮控件的所对应的的html元素绑定一段新的JavaScript代码。利用新的WebForm_DoPostBackWithOptions函数代替惯例之前所利用的__doPostback函数。详细的HTML代码示比方下:

<inputtype="submit"name="Button2"value="PostbacktoSecondPage"Button2","",false,"","SecondPage.aspx",false,false))"id="Button2"/>
  上述代码中的WebForm_DoPostBackWithOptions函数与WebForm_PostBackOptions函数的javascript代码以下:

functionWebForm_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;
}

functionWebForm_DoPostBackWithOptions(options){
varvalidationResult=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){
varlastFocus=theForm.elements["__LASTFOCUS"];
if((typeof(lastFocus)!="undefined")&&(lastFocus!=null)){
if(typeof(document.activeElement)=="undefined"){
lastFocus.value=options.eventTarget;
}
else{
varactive=document.activeElement;
if((typeof(active)!="undefined")&&(active!=null)){
if((typeof(active.id)!="undefined")&&(active.id!=null)&&(active.id.length>0)){
lastFocus.value=active.id;
}
elseif(typeof(active.name)!="undefined"){
lastFocus.value=active.name;
}
}
}
}
}
}
if(options.clientSubmit){
__doPostBack(options.eventTarget,options.eventArgument);
}
}
  用户点击按钮时,以后表单将内容提交给PostPageUrl属性所指定的方针页面。当页面中含有能够完成跨页面提交功效的控件时,页面会创立一个name为__PREVIOUSPAGE的埋没字段,此字段包括了源页面的信息。方针页面则利用此信息来创立一个完全形态的援用来挪用源页面临象。上述埋没字段的相干HTML代码示比方下:

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

  ASP.NET2.0新增的跨页面提交功效,让我们的开辟历程有了加倍天真的选择。在利用跨页面提交的时分,我们要依据实践的情形选择符合的体例来读取源页面中的信息。假如源页面与方针页面处于统一个使用程序以内,我们能够选择利用@PreviousPageType指令来指定源页面,如许就能够利用强范例援用的优点。

  因为ASP.NET中的每一个页面类所包括的子控件对应的是protected成员,以是您不克不及间接经由过程PreviousPage援用来会见源页面中的控件,而先必要将源页面中必要被会见的属性公然出来。同时,倡议您只将必要的信息作为大众属性公然,以削减大概被潜伏的歹意用户利用的信息。
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)
深爱那片海 该用户已被删除
沙发
发表于 2015-1-17 16:35:26 | 只看该作者
提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。
谁可相欹 该用户已被删除
板凳
发表于 2015-1-20 20:35:10 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
admin 该用户已被删除
地板
发表于 2015-1-29 21:40:54 | 只看该作者
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
灵魂腐蚀 该用户已被删除
5#
发表于 2015-2-6 05:24:57 | 只看该作者
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
小女巫 该用户已被删除
6#
发表于 2015-2-15 14:05:10 | 只看该作者
那么,ASP.Net有哪些改进呢?
莫相离 该用户已被删除
7#
发表于 2015-3-4 11:35:01 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
爱飞 该用户已被删除
8#
发表于 2015-3-11 19:18:02 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
因胸联盟 该用户已被删除
9#
发表于 2015-3-19 09:22:55 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
分手快乐 该用户已被删除
10#
发表于 2015-3-27 17:10:10 | 只看该作者
那么,ASP.Net有哪些改进呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-4 18:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表