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

snowfox373 2007-12-9 22:06

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

  ASP.NET 2.0,它的功能有所扩展,能够允许跨页提交。标准HTML表单(form元素)允许你向另外一个页面或者应用程序传递和发送数据信息,方法是使用表单元素。在ASP.NET 1.x中,网页则利用投递机制,把页面数据提交给该页本身。下面就让我们来探讨这个新特性:8}xr7_3n6H

Ga P6M3^`k   传统办法|r}^!y~E^
+E3R.s*tmgW5m;D
  为了便于比较,我们来回顾网页传递数据的老方法。HTML的表格元素有一个action(动作)属性,用来指定服务器端哪项资源(所谓资源,是指一个网页、一段脚本、程序等)来处理这些提交的数据。下面的代码便是一个样例。[code]<html>  
jX%s7K_']R"w <head><title>Sample HTML form</title></head>  
5x7M d&E+_3wA <body>  
#e!e8r*R n k9|5] <form name="frmSample" method="post" action="target_url">  
A]S&w,f,f&z <input type="text" name="fullname" id="fullname" />  !d&};D"NQr$@S-O
<input type="button" name="Submit" value="submit" />  
#{3P8|x,r |_O </form>  6Sr*]p*Vl sIY
</body>ot!BE x\#`%XM
</html> [/code]  在文本域(名字是fullname)中输入的值将被提交给表单元素的action属性指定的页面或者程序。对于ASP.NET开发者,即使曾经用过标准HTML表单,也是极不多见的。
't-SU!tm0f r$b G B4rQ/@%a6Y|?#m;|"o
  ASP.NET开发者面对要从一个网页向另一个网页传递数据信息的任务时,方法选择的余地是异常广阔的。它们包括会话变量(session variables)、cookies、querystring 变量、caching(网页缓存),甚至Server.Transfer方法,但是ASP.NET 2.0还提供了另外一种选择。
&DCF?\5h5N;}^ `I} o.\:M)}
  ASP.NET 2.0提供的又一办法*v IS+y.~ieSD

!PTi~+W&W8bm   在设计ASP.NET 2.0的时候,微软认识到了在网页间交叉传递数据的需求。有了这个意识之后,就为ASP.NET的button(按钮)控件增加了一项PostBackUrl属性。它允许你在用户提交的时候,指明这张表单和上面的数据送往何方(也就是由PostBackUrl属性指定的URL值确定)。一般来讲,跨页传递是客户端在后台使用JavaScript进行传送的过程。[code]<%@ Page language="vb" %> 6Pw-g)~!N C cY^
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
k|1fQ@#h c <html><head> !D@!r%ZbpZ7@
<title>Cross Postback Example</title>
1n1S0[yJIVA </head><body>
6Opv N9Be] <form id="frmCrossPostback1" method="post" runat="server">
pAF*sTVl <asp:Label ID="lblName" runat="server" Text="Name:"></asp:Label> 'Cgfp_+_m{Z
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>g4~5m~3] c/B5O)~(l

)^ezb!D[ <asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:"></asp:Label>
(vnXu6msM <asp:TextBox ID="txtE-mailAddress" runat="server"></asp:TextBox>
Fd4X |#b(Vq9|   
S*i,RfN <asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" />
h3{4[+e+B Be </form>
H:}3D;q;Z/g:g U </body>
G^5VXgg W4J </html>[/code] ASP.NET页面拥有两个文本域(分别表示name(名字)和e-mail(电子邮件)),以及一个用来提交数据的button(按钮)。这个提交按钮的PostBackUrl属性被指定为另外一个网页,这样使得表单提交的时候,数据可以发送到那个页面。注意:这个例子中,表单元素通过设置method(方法)属性,让表单提交时采用post[2]提交方式,但这不是必要的,因为所有cross postback(跨页投递)根据设计均使用post方法。G+D? L2\'X
6yj0|]&]x:?M*L
  使用先前页面 S&Gmg5V?:ca
+RL| KX
  ASP.NET页面经由跨页投递的调用而载入的时候,它上面的对象的IsPostBack属性不会被触发。不过,有一项叫做PreviousPage(前一页)的属性使你能够访问和使用那些应用跨页投递的页面。/l4btp-I+]*U8vz

-|#}Avt wu   每当一个跨页请求发生时,当前页的PreviousPage属性就把促发投递的页面引用保存下来。如果页面的产生不是来自跨页投递的激发,或者说页面处于不同的程序组,那么PreviousPage属性将不会被初始化。
1kO;A'cC3H+gV N3I d/hD
  你可以通过检查PreviousPage对象来确定页面的载入是否为跨页投递的结果。值如果为null,则说明是普通的载入,而非null值则表明网页来自跨页投递。此外,页面类(Page class)还包含了一个称作IsCrossPagePostBack的方法(method),专门用来确定页面是不是跨页投递的结果。e)frM)O#l

U1Jki6s!M@~3G.w   一旦确定发生了跨页投递,你就可以通过PreviousPage对象的FindControl方法去访问调用页(calling page)上的控件。下面的代码是我们例子中的第二页;它由前面列出的页面所调用。[code]<%@ Page language="vb" %>
!nsh%{#EVP1_ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
,C/D5@ly3}#\ <html><head>
s2HX5a'e6NW <title>Cross Postback Example 2</title>
@$OIzN/o_ </head><body> r:LQ3c3\of
<script language="vb" runat="server"> R+K-D5u#bXyMq\
Sub Page_Load()
3XS*~Xi If Not (Page.PreviousPage Is Nothing) Then
6s6M5Du Ou If Not (Page.IsCrossPagePostBack) ThenResponse.Write("Name:" + CType(PreviousPage.FindControl("txtName"), TextBox).Text + "X^ ^P:J n M
")Response.Write("E-mail:" + CType(PreviousPage.FindControl("txtE-mailAddress"), TextBox).Text + "
#z0K.i6q%By h.G ")  +^A.Z:h8b
End If ti R ^}ix,ZZ/e
End If k7J0lC9aa
End Sub
S]T9qR'OO </script>
8|~)^D rl%Qu </body> LTU+hhk;r/h
</html>[/code]  这个页先判断它是不是由跨页投递所调用。如果是,就通过FindControl方法访问来自调用页的数值,并把用此方法得到的控件转换为TextBox控件,然后显示它们的Text(文本)属性的内容。
_ l`RkD 2V |af1q erUO
  你可以把整个PreviousPage对象转换成触发跨页投递的页面类型。这个方法允许你访问页面的全局属性(public properties)和方法。下面代码是添加了两个属性的第一个清单,这两个属性用于访问域值。[code]<%@ Page language="vb" %> FK f]W!J;@:Q-a P
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > A? oD U l9wa? D\
<html><head>
R ~p7A9_x I <title>Cross Postback Example</title>
)S T7v,`Q <script language="vb" runat="server"> Z CP/[0{0QVu
Public ReadOnly Property Name
G? h#A l'M6XHlr Get
E{*[a%@` Return Me.txtName.Text
i"J*[7[|c)I{ End Get
Z r2B"mLOI6s End Property 6CMRG4g
Public ReadOnly Property E-mailAddress NJ#hN%}.^
Get ?]D,U*xm2c _Lb4^
Return Me.txtE-mailAddress.Text
uW:q&Ykv End Get
V!]p~V;H.K*A End Property
D BmN8_g| </script></head><body> *_5} nE1E)h
<form id="frmCrossPostback1" method="post" runat="server">
"^r\y H G <asp:Label ID="lblName" runat="server" Text="Name:"></asp:Label>  8y5C0tn|W4{"D%x
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
9b i6s%eZ6R-X "WD5KBj:{:Mc[@
<asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:"></asp:Label> .b,^L"}o`X Y
<asp:TextBox ID="txtE-mailAddress" runat="server"></asp:TextBox>
/}U;U~1SC zM4F7F A*V1Ws0e
<asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" /> cnq\h-\-l2^
</form> RM:`_T)en
</body> 1V \6OS(z&[
</html>[/code] 既然现在属性已经建好,那你就能很容易访问它们。要警惕的是,Page类的PreviousPage对象必须转换成正确的类型,这样才能正确访问它的属性。这可以通过把它转换成合适的page类别的对象加以实现。[code]<%@ Page language="vb"%>
q*{lX2StoP <%@ Reference Page="~/CrossPostback1.aspx" %> /o!T^HDK f%K7H
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > UJ%RC q;P(T
<html> X~0x;WTYsd:L)\Z
<head>
dI)iR(p\r.HGn <title>Cross Postback Example 3</title> 0?(Qh-`i#y6oT
</head><body> .P o3C+xtEf
<script language="vb" runat="server">
"Q];|t D*h P5g Sub Page_Load()
H&C5a6g a Dim cppPage As CrossPostback1_aspx
y:N5mzeP }9F If Not (Page.PreviousPage Is Nothing) Then
hFB6MAx8}Q8e k If Not (Page.IsCrossPagePostBack) Then mqZ0` A?({ F(}
If (Page.PreviousPage.IsValid) ThencppPage = CType(PreviousPage, CrossPostBack1_aspx)Response.Write("Name:" + cppPage.Name + " p\,y$dL ^ [
")Response.Write("E-mail:" + cppPage.E-mailAddress)  
*gZE]V b_*^w`x4a3u
End If 'N2n(?@h @I!~6n8Z
End If 5T ewNK7l7Qo?!kC
End If /]#O6\Y? nS2k
End Sub
-E/mwW3| </script>
$D-X3L\ Q3_I O </body> Z0L.v4F_3D dy&?b
</html>[/code]  说明了这一点,它在页面头部定义了调用页的一项引用,那样这个引用类型就能在代码中使用。通过这项引用,实际的VB.NET代码使用CType函数把PreviousPage对象转换成了适当的类型。这之后,那些属性就可以像代码示范的那样使用了。
:{YP}-c([RT-B
.S$]^pw:s]   关于上述清单中PreviousPage对象IsValid方法的使用在此提醒一下:前页的IsValid属性保证你对它操作之前,它已通过所有合法验证测试。
~g3_Un 9x ~ I)r/_ g9w6zK
  总结
A{3i,u cLoZ OV,?Tp^"Y1hV+kn
  在网页间传递数据参数有很多项应用,包括保持个人用户信息。祖传的网页解决方案,像使用querystring和cookies,允许你很容易当提交发生时从一个页面指向另一个页面。
u,ITS Sm] [kf[w$ba
  ASP.NET 1.1除了提供额外方法外,对这些方法也能很好地支持,可是,ASP.NET 2.0依靠跨页投递,使这方面又有了长足发展。它让一个网页处理来自另一网页的数据变得简单。在你开发你的下一个ASP.NET 2.0程序的时候,可要好好利用这个新概念的优势啊。

chongziwz8 2008-12-1 00:41

电磁阀关阀时流体不能切断的原因

[b][url=http://www.samsonshanghai.com/diancifa.html]电磁阀[/url][/b]关阀时流体不能切断是由于流体粘度不符合流体温度不符合弹簧变形或寿命到期阀座有缺陷或粘附赃物密封垫脱出`缺陷或变形平衡孔或节流孔堵塞使用时工作频率太高或寿命到期.更换合适的产品加垫片或更换弹簧清洗、研磨或更新更新、 重新装配及时清洗则改选<a href="http://www.samsonshanghai.com/diancifa.html">电磁阀</a>型号或改换新产品。
页: [1]
查看完整版本: ASP.NET 2.0功能扩展:跨页提交