查看完整版本: ASP.NET 2.0功能扩展:跨页提交

snowfox373 2007-12-9 22:06

ASP.NET 2.0功能扩展:跨页提交

  ASP.NET 2.0,它的功能有所扩展,能够允许跨页提交。标准HTML表单(form元素)允许你向另外一个页面或者应用程序传递和发送数据信息,方法是使用表单元素。在ASP.NET 1.x中,网页则利用投递机制,把页面数据提交给该页本身。下面就让我们来探讨这个新特性:
Y3R+Mr4{ k8A3Z6Y9q~T
  传统办法
8w NB8A)Don'R B grUS s6O8`
  为了便于比较,我们来回顾网页传递数据的老方法。HTML的表格元素有一个action(动作)属性,用来指定服务器端哪项资源(所谓资源,是指一个网页、一段脚本、程序等)来处理这些提交的数据。下面的代码便是一个样例。[code]<html>  H&S-t:e5eS'D
<head><title>Sample HTML form</title></head>  )k`x$n(Q#N K,fH
<body>  
/@T#H*_6H7X:{uV <form name="frmSample" method="post" action="target_url">  
N!BB9ie4| <input type="text" name="fullname" id="fullname" />  
-c ~[@B"ff"D <input type="button" name="Submit" value="submit" />  eB[8lK6kF,E,s
</form>  
*y;M7~3h i,tF </body>$U$N9@!^2{3_ \&x#W
</html> [/code]  在文本域(名字是fullname)中输入的值将被提交给表单元素的action属性指定的页面或者程序。对于ASP.NET开发者,即使曾经用过标准HTML表单,也是极不多见的。
0_l1OW8^O
&ij'X],`b"w] q4H*?   ASP.NET开发者面对要从一个网页向另一个网页传递数据信息的任务时,方法选择的余地是异常广阔的。它们包括会话变量(session variables)、cookies、querystring 变量、caching(网页缓存),甚至Server.Transfer方法,但是ASP.NET 2.0还提供了另外一种选择。w3L `5Ic,XW;X4[

;Px.Rjj4Meb   ASP.NET 2.0提供的又一办法
.mGa(b{p8qs MtD"g@-s:p4Z&zY~
  在设计ASP.NET 2.0的时候,微软认识到了在网页间交叉传递数据的需求。有了这个意识之后,就为ASP.NET的button(按钮)控件增加了一项PostBackUrl属性。它允许你在用户提交的时候,指明这张表单和上面的数据送往何方(也就是由PostBackUrl属性指定的URL值确定)。一般来讲,跨页传递是客户端在后台使用JavaScript进行传送的过程。[code]<%@ Page language="vb" %>
d/YD e k <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > 'zY2rJM8mT V"a
<html><head> $Y0B;bt,Dk
<title>Cross Postback Example</title> m)A"Tp;]
</head><body> 1m9z/FR@Ca,\D4C
<form id="frmCrossPostback1" method="post" runat="server"> 6d LH7f)oB;F
<asp:Label ID="lblName" runat="server" Text="Name:"></asp:Label> -Ki.K,mDE
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>F!?o]A2~.G

$TuH ]'? <asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:"></asp:Label>
Q.[+tH| u4l X <asp:TextBox ID="txtE-mailAddress" runat="server"></asp:TextBox>
!v8{K'B?m?e9c   0NN#BCdX1f @o6vI
<asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" /> M1_&S+Ng8S'u'leHL
</form>
Z[]!Z6D </body> ^n,n xT0V u
</html>[/code] ASP.NET页面拥有两个文本域(分别表示name(名字)和e-mail(电子邮件)),以及一个用来提交数据的button(按钮)。这个提交按钮的PostBackUrl属性被指定为另外一个网页,这样使得表单提交的时候,数据可以发送到那个页面。注意:这个例子中,表单元素通过设置method(方法)属性,让表单提交时采用post[2]提交方式,但这不是必要的,因为所有cross postback(跨页投递)根据设计均使用post方法。
db}U9B"o&W
0_'c!^r J#? ZM!a   使用先前页面)J!E \b6MK:R d \

xnmqd3h7QM   ASP.NET页面经由跨页投递的调用而载入的时候,它上面的对象的IsPostBack属性不会被触发。不过,有一项叫做PreviousPage(前一页)的属性使你能够访问和使用那些应用跨页投递的页面。
uB1S0o]8u_ 5IJ.~&q$E`,e q(N,w
  每当一个跨页请求发生时,当前页的PreviousPage属性就把促发投递的页面引用保存下来。如果页面的产生不是来自跨页投递的激发,或者说页面处于不同的程序组,那么PreviousPage属性将不会被初始化。$E6DMY!MD
vw5S T8D(B
  你可以通过检查PreviousPage对象来确定页面的载入是否为跨页投递的结果。值如果为null,则说明是普通的载入,而非null值则表明网页来自跨页投递。此外,页面类(Page class)还包含了一个称作IsCrossPagePostBack的方法(method),专门用来确定页面是不是跨页投递的结果。 A iw{9g,fg

5~$[6F-P'pOD|k'p B   一旦确定发生了跨页投递,你就可以通过PreviousPage对象的FindControl方法去访问调用页(calling page)上的控件。下面的代码是我们例子中的第二页;它由前面列出的页面所调用。[code]<%@ Page language="vb" %>
%oe K!{3F <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
:?;EA3Au Iy <html><head> i2tm@D!S$V/k
<title>Cross Postback Example 2</title> }"xi6_"R&~:I,DK
</head><body>
}!^V9Gp_0p?x_ <script language="vb" runat="server"> _nl6cXbx
Sub Page_Load()
~`I9{ psH If Not (Page.PreviousPage Is Nothing) Then
2G yx[ L'{(p If Not (Page.IsCrossPagePostBack) ThenResponse.Write("Name:" + CType(PreviousPage.FindControl("txtName"), TextBox).Text + "0j(KO1EH7U*H6Q
")Response.Write("E-mail:" + CType(PreviousPage.FindControl("txtE-mailAddress"), TextBox).Text + " iL:K)Pv#qYXo
")  
EyQ/H[ T3\o End If 4rbu"d C p,gg
End If 'K~)U2CHi
End Sub 2CU5S~(s7N
</script>
z4Kf2R)d3~$IK3y(B </body>
K\$jX5w(AN&iN </html>[/code]  这个页先判断它是不是由跨页投递所调用。如果是,就通过FindControl方法访问来自调用页的数值,并把用此方法得到的控件转换为TextBox控件,然后显示它们的Text(文本)属性的内容。
K5VQd3ZLx,@ F+P N%{q7C M
  你可以把整个PreviousPage对象转换成触发跨页投递的页面类型。这个方法允许你访问页面的全局属性(public properties)和方法。下面代码是添加了两个属性的第一个清单,这两个属性用于访问域值。[code]<%@ Page language="vb" %> .]-l9kS$o~-Ay
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > Jn$ig dJtH%af
<html><head> ,Sn$v.u ^/fn
<title>Cross Postback Example</title>
1]$C d m7RB <script language="vb" runat="server">
[sb-nOz m6C\ Public ReadOnly Property Name
Q/pX \ }7`&A Get
3UA-QG5@ @:^J{A Return Me.txtName.Text 2}&Qe0pf:h9vU*zH_
End Get oY%A$U1t;ok&^*n'Y@
End Property
*k H?_BAXg$EAM"~ s7g Public ReadOnly Property E-mailAddress
m9lQzX/x Get
,{j7k1qKX(L,e/n Return Me.txtE-mailAddress.Text \Tdv _*g3dR
End Get c?UV})dUfr
End Property ]!\viUB)h(B
</script></head><body>
7B.^{%i^XLY <form id="frmCrossPostback1" method="post" runat="server"> 4E^a5N}H^
<asp:Label ID="lblName" runat="server" Text="Name:"></asp:Label>  Q9Q TnpB@,V];aS)A
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>3S%Z5~:Se0m M$by"L

0i;z,v5x7x:? <asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:"></asp:Label> /EJ3fFdpv2Ug
<asp:TextBox ID="txtE-mailAddress" runat="server"></asp:TextBox>
-Bm&U:~o&z#F#a%l0hB r
:s0`*W$pe.J IG <asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" /> 4Pt+S2f-d b
</form>
gt&DR7P)K </body> "Ia`C^/_0y;sZ
</html>[/code] 既然现在属性已经建好,那你就能很容易访问它们。要警惕的是,Page类的PreviousPage对象必须转换成正确的类型,这样才能正确访问它的属性。这可以通过把它转换成合适的page类别的对象加以实现。[code]<%@ Page language="vb"%> iPw{]gx'TP0|:p
<%@ Reference Page="~/CrossPostback1.aspx" %> SE-W&p\8N)K
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > T$Z.W @`(LK
<html> %G*{!j|5g/qA/d8H+l
<head> j q+D3w8J\J2x
<title>Cross Postback Example 3</title> +f%`eo kW4O]p
</head><body>
&xx y3@X ~0J"d Kn <script language="vb" runat="server">
z4H9Gb2A@ q Sub Page_Load()
b+T&N;X;y)vxpXfVf Dim cppPage As CrossPostback1_aspx
n\^o&F(O If Not (Page.PreviousPage Is Nothing) Then mW5Wc6{] m
If Not (Page.IsCrossPagePostBack) Then $v6Kp1hw `&Jb
If (Page.PreviousPage.IsValid) ThencppPage = CType(PreviousPage, CrossPostBack1_aspx)Response.Write("Name:" + cppPage.Name + "
-Qn"f.a-z&_id(_0l ")Response.Write("E-mail:" + cppPage.E-mailAddress)  
Bdes9T!{
,q C/ZE Wb!cF P End If
2F5x+?4N/B,J End If
#M(X5hfU End If
7K | e.C"wYw9y8c_7Rc End Sub
@"m SME%B.R1a)i{(r </script>
Y\ EHq </body> 2XpTS#E
</html>[/code]  说明了这一点,它在页面头部定义了调用页的一项引用,那样这个引用类型就能在代码中使用。通过这项引用,实际的VB.NET代码使用CType函数把PreviousPage对象转换成了适当的类型。这之后,那些属性就可以像代码示范的那样使用了。"J$N/a ]:]p
_!p/j&U}
  关于上述清单中PreviousPage对象IsValid方法的使用在此提醒一下:前页的IsValid属性保证你对它操作之前,它已通过所有合法验证测试。8w(y:W"~&Y Mk

r/fK!|)lU;s   总结
o h5\M2SMc(L%G}
f4P9q]a*m-S*D_n   在网页间传递数据参数有很多项应用,包括保持个人用户信息。祖传的网页解决方案,像使用querystring和cookies,允许你很容易当提交发生时从一个页面指向另一个页面。.Gbg)IR

,u5Xzz-l~   ASP.NET 1.1除了提供额外方法外,对这些方法也能很好地支持,可是,ASP.NET 2.0依靠跨页投递,使这方面又有了长足发展。它让一个网页处理来自另一网页的数据变得简单。在你开发你的下一个ASP.NET 2.0程序的时候,可要好好利用这个新概念的优势啊。
页: [1]
查看完整版本: ASP.NET 2.0功能扩展:跨页提交
查看完整版本: ASP.NET 2.0功能扩展:跨页提交