你的位置:睿鑫网络 >> 编程 >> web开发 >> ASP.NET >> 详细内容 在线投稿

ASP.NET 2.0服务器控件之处理回传数据

排行榜 收藏 打印 发给朋友 举报 来源: 网络   发布者:未知
热度8票  浏览14次 时间:2010年1月15日 10:40

cx4p rO]0为自定义服务器控件实现事件,是一个比较复杂的过程。开发人员不仅需要根据上一篇文章中介绍的方法,实现捕获回传事件,而且有时候还需要参与回传数据处理过程。本文将通过典型应用介绍处理回传数据的方法。

nSD)qEi0M3W0 睿鑫网络:W7@.m#Y }e&C

1. 实现处理回传数据

VG,i_LNfX] Y0 睿鑫网络4R%lk&hUKLA-BF%p

在上一篇文章介绍的捕获回传事件过程中,往往都不涉及回传到服务器的控件数据。开发人员主要实现IPostBackEventHandler接口就能够成功捕获事件,并为之定义事件处理程序。然而,有些服务器控件在应用过程中,涉及回传数据的变化等情况。例如,自定义控件是一个输入控件,当用户输入并回传后,可能会由于回传数据的变化而引发一些事件。为了处理以上问题,控件类必须实现IPostBackDataHandler接口。下面列举了接口声明代码。睿鑫网络 e.O`V?D,O_)Y

睿鑫网络FUM!{qhf&L^C

public interface IPostBackDataHandler{ public bool LoadPostData ( string postDataKey, NameValueCollection postCollection ); public void RaisePostDataChangedEvent ();}睿鑫网络 @"X;u xL't

睿鑫网络N}j"Ak"X

IPostBackDataHandler接口用于在创建需要由客户端回传到服务器的窗体数据的服务器控件时使用。如上代码所示,该接口包括两个方法,LoadPostData和RaisePostDataChangedEvent。睿鑫网络$Olc w'b i5O8z|

M+L Y H7h6G ];i0与实现捕获回传事件类似,仅仅在控件类中实现接口是不完整的。下面总结了为了实现处理回传数据而必须实现的两个要点。

P@`WJ6v~"wJ o @0 睿鑫网络-XzC5wP([9H

第一、必须在控件呈现中将控件的name的属性值设置为UniqueID。这是由于发生回传后,页框架将在发送的内容中搜索与实现IPostBackDataHandler的服务器控件的UniqueID匹配的值,然后才能调用LoadPostData方法。

y"H2~ QsE?(cj0 睿鑫网络u:czbVX*f#R1@

第二、控件类必须实现IPostBackDataHandler接口,并实现LoadPostData和RaisePostDataChangedEvent方法。LoadPostData方法用来检查提交给服务器的数据。该方法包含两个参数:postDataKey表示用于识别控件内数据的关键值,postData是提交数据的集合,其采用Key/Value结构便于使用索引名称访问。要访问集合中的控件数据,只要采用如下代码即可:"string nData = postData[postDataKey]; "。在LoadPostData方法中,通过新数据(客户端发送的数据值)与旧数据(先前提交给客户端的数据值)进行比较的结果来确定方法返回值。如果新旧数据相同,则说明数据没有被修改,方法返回值为false;如果新旧数据不同,则表明旧数据已经被客户端修改,方法返回值true。下面是LoadPostData方法的一个简单应用。

:b:uk'{\k_ n6g0

h-N!O:r/K5S t)xM0public virtual bool LoadPostData(string postDataKey,NameValueCollection postData)睿鑫网络C(IT9isT+F3_`\g

OOQ H JCGc0{睿鑫网络gE]2F6b)S

睿鑫网络F6^$t9t9K!^h~n

 string presentValue = Text;

!g Kj| Mh0 睿鑫网络lFZ!P\

 //旧数据

LOZ%y*a0

5WHy@6s1mx nv0 string postedValue = postData[postDataKey];//新数据睿鑫网络C5_)o&JH;O"jAqQ

睿鑫网络{+{ Zgn9P

 //检查新旧数据

b J:Z ^f6SzO0 睿鑫网络Y4o q [ hj&P

 if(presentValue.Equals(postedValue) || presentValue == null) {

7Dd n$g2g/x0

2av j]q5Y_R0  Text = postedValue;睿鑫网络 n(U9_wSK

c2h,z8cn0  return true;

;|k7hwT!DK ?(i0

vH3x0K9~.{0 }

5Y/}7u9OiA$b0 睿鑫网络,aikF^7}

 return false;睿鑫网络?@ \&vYkL

睿鑫网络TYt6ae[ t

}

L$i E-gx9g0 睿鑫网络/z&CrA `.Y)zv

如果LoadPostData方法返回true,.NET框架将自动调用RaisePostDataChangedEvent方法。该方法用信号要求服务器控件对象通知ASP.NET应用程序该控件的状态已更改,控件开发者可以在该方法中定义根据数据变化引发的事件。下面是简单的调用OnTextChanged方法:

f)}[ MzQ `0 睿鑫网络"[1Y0|Lt/Ux0@PR

public virtual void RaisePostDataChangedEvent()

B7}1c^'l8N0

&}&G1l4IL6j0{睿鑫网络 O)|b!h x2Y8CJ

睿鑫网络/Q/A,QR}Zw2K!s9O

 OnTextChanged(EventArgs.Empty);

;G FCSN2J |g4B]0

'JK0Ia9@/e0}

}6Q'[5_M~|,|f.`0 睿鑫网络(Zsk;LO/W

以上是处理回传数据的实现要点,掌握这些要点对于事件处理具有至关重要的意义。同时,其内容也说明了以下.NET框架处理回传数据的过程:睿鑫网络iRI j3u LMq

睿鑫网络h*a\&d[ n

(1)首先在发送的内容中搜索与实现IPostBackDataHandler的服务器控件的UniqueID匹配的值。

"X8w N w)P'~nO vK0 睿鑫网络2ly({!rp2A)k

(2)调用LoadPostData方法,并返回bool值。睿鑫网络;}4ZCG LmX$q"[$Y

$C5?F7yX)P1Zm0(3)如果LoadPostData方法返回true,那么调用RaisePostDataChangedEvent方法。

Pw/IK#h'V:H0

Z\:pm r-I0(4)执行RaisePostDataChangedEvent方法中定义的OnEvent方法。睿鑫网络9a&FK;{1Mj(e

睿鑫网络iE3H\X&D8_3p A

2. 典型应用

)S!`3r x'U Dbw:d9oK*U0 睿鑫网络"s3o6JgL[

下面通过一个典型实例说明处理回传数据的核心过程。创建一个自定义文本框控件WebCustomControl,其文本属性Text因回传而更改。控件在加载回传数据后引发TextChanged事件。控件类源代码如下所示:睿鑫网络5E*W4DyJF)TZ+Y$z

睿鑫网络/i2CEt|.f6r7[

using System;睿鑫网络B{ T0OHI eq

}z?:?)g v"~!A0using System.Collections.Generic;

hP2W Y6G]'y0

?&M] R/SbP2d4z0using System.ComponentModel;睿鑫网络y#G\#W|-S$loy

睿鑫网络r8p#f2sg4|Q?!Y@

using System.Text;

u gJ0H e)S0 睿鑫网络*n;])u"f1QRT}+x

using System.Web;

3?N0a#t2oKq.C0 睿鑫网络)r7Vj$]#Rhk&Jp9g

using System.Web.UI;

M4_|J1oMa0

e \(aZ\JG(? y0using System.Web.UI.WebControls;睿鑫网络0V6n6f J-j#QVh

+RZai0zO;G~w9iSv0namespace WebControlLibrary{睿鑫网络GW/f1WY6x

+wT Yt2D7@0 [DefaultProperty("Text")]睿鑫网络|qShp&s!PfWU

睿鑫网络&A&mm&n z3^ l7|

 [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")]

c,H8`J ~4R1^Y u@"}0 睿鑫网络)DEhx8a ` |2| T*_S

 public class WebCustomControl : WebControl, IPostBackDataHandler {

3A'?3RF@ai0

(eP1`Mfk:B0  // 实现Text属性睿鑫网络NW8H"FqKe

(s[$H#worm]'}3dmF0  [Bindable(true)]睿鑫网络;}2HU7o9J%C

)[)M9M$V;^T Y5[![-Ja0  [Category("Appearance")]

9|bL n"r{0

6LM{/E5xec|0  [DefaultValue("")]

2i*m5F2L"{0

!o&m [&m1K)P6f4??4R0  [Localizable(true)]

zIy(H3M p0

_ IvS/Pi:b&o q [0  public string Text {睿鑫网络G7{ J0LH/B&C

6K i&} X;z*OX8B0   get {睿鑫网络0U#e7L @OlK

睿鑫网络'\N WZ*k

    string s = (String)ViewState["Text"];睿鑫网络D)ku&\!H@Pj`Y+O BW

q-A-b'w2SM2K0    return ((s == null) ? String.Empty : s);

.j3Pc(WfIz0 睿鑫网络'pH)TB;L.\%oCp-hM

   }睿鑫网络0z$Z(w'jt

Bx+i,uJ;x7xp#R0   set {睿鑫网络~0^K0Pp/`u

l @C f/U4P!a9w0    ViewState["Text"] = value;睿鑫网络+d+mCzy'~5]

_%P9?)J/KpR/`0   }

5DR3U8} G0

*c"g$[1P"l(x4u0  }

sV%]]!H N8w dZ0 睿鑫网络Y t(U7u(ZMFsAZ

  //重写控件呈现方法RenderContents

P Tk$ri2Ta*p0 睿鑫网络0?![zj*u t:b$J5H

  protected override void RenderContents(HtmlTextWriter output) {睿鑫网络2z%{1Aw+}"~|?

睿鑫网络Ms8a+^$\ vaE9H

   output.AddAttribute(HtmlTextWriterAttribute.Type, "text");睿鑫网络Y0z nt%`6]6M|;E

睿鑫网络3]*[$[@+KdYj

   output.AddAttribute(HtmlTextWriterAttribute.Value, Text);睿鑫网络Zh!z;LY/]

"[ b"yVjN7c0   output.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);

s"eT nS(rx R0

,n0jvJ ?r)[0   output.RenderBeginTag(HtmlTextWriterTag.Input);睿鑫网络*pIXt3@:P9x e

睿鑫网络6M8I*br+I

   output.RenderEndTag();

7nMTgE)E%sL[ B0

-GyA(L(a/Kw4?$d0  }睿鑫网络.wj ib#la8P

睿鑫网络UJr'A S@yLAp

  //定义事件对象EventTextChanged睿鑫网络 S$H ^a TN)c6JY

ZZRgO9Ay"N Q0  private static readonly object EventTextChanged = new object();睿鑫网络5g^+b[N w;gp{/["v

e4h-gbq/{)e&|0  #region 实现IPostBackDataHandler 成员睿鑫网络3rd&bwyeS#wnj

睿鑫网络!OWq)H A.a

  bool IPostBackDataHandler.LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) {睿鑫网络"^*ds_-fcBi

睿鑫网络:L e9J:p!\kQa

   //比较初始数据presentValue和回传数据postedValue

6g:?Ha#`ad0|4g0 睿鑫网络 H P&RbFe#tkq

   string postedValue = postCollection[postDataKey];

y*p X|2r!Qy0 睿鑫网络r7? ?{7mY _?4Z"P

   string presentValue = Text;睿鑫网络m1AU u0D{R

IA Y-g d4n0   if (presentValue == null || postedValue != presentValue) {

9J3{ r umn4`0

BR:l@&vE*WiD0    Text = postedValue;

$OE} Y:@0 睿鑫网络Mj _:W \:P%P C

    return true;

2l7kF#Kzxn![7Q6s0

$o dja0cr6G4D"do0   }

'tGtZE T0 睿鑫网络,x3bh7@t/_

   return false;

b-X-tfxO0

1M`Vyh0  }

_6W?0d5s2Eyl+Bt0 睿鑫网络5T{b Q {Kg;[

  void IPostBackDataHandler.RaisePostDataChangedEvent() {

:z"U8OI y)C0 睿鑫网络:t)D$v4X CG$b0dh(h

   OnTextChanged(EventArgs.Empty);

^;e M.HT0 睿鑫网络QA_4z5I9V} m

  }

7dpH diiC0

&dp4cl]$N N0  #endregion // 实现事件处理程序OnTextChanged

I0qSQQ8H{0

D2ddU+o0  private void OnTextChanged(EventArgs eventArgs) {睿鑫网络MR#@3[K5rC

-GkuF/n#o r0   EventHandler textChangedHandler = (EventHandler)Events[EventTextChanged];睿鑫网络d3kKb iA

睿鑫网络[8xT[6^

   if (textChangedHandler != null) {睿鑫网络DX$w U;M D*d*O

MO`8V5D_\$o0    textChangedHandler(this, eventArgs);睿鑫网络b.^E7N-gAX

Tg3W(@9h'Pe~m0   }睿鑫网络z4b?C^_Ay

O P)JLV$Z;S0  }睿鑫网络|MW1m0z]3|(X

.`BD#Q]b0  // 为TextChanged实现事件属性结构睿鑫网络:Q.e5IC1H.e3RV,E9?

-af-j E`^W6T}0  public event EventHandler TextChanged {睿鑫网络0EFS Ues X Oq

睿鑫网络O0O Ns G

   add {

M!In$J2]c-T0

(iv,]N"H;@:\ Z0    Events.AddHandler(EventTextChanged, value);

|9C3\e Xue0 睿鑫网络2|Z5X1rR4r)GT

   }

LiZ7?C2B0DZ0 睿鑫网络RZKd|#oEJ E5]$_

   remove {睿鑫网络4y)RuN&V9_;lE8},q

睿鑫网络!vKJ5v.T-pk Pr[

    Events.RemoveHandler(EventTextChanged, value);睿鑫网络T2q Jz+VA3{AT

2Ux G ~FGi0   }

K `B |.a&n u!g\*}0 睿鑫网络p:SP:[7PM3y1ep7`

  }睿鑫网络eu"L A*H-M0I

睿鑫网络@o+Q o-yY

 }睿鑫网络 k wiw]*F'F

睿鑫网络 }4r?*|'Q"j z

}

\c1\%Rej!oa3[0

Ae5m2Z9fD@Y-gV0以上源代码实现了一些重要内容。

nx${DYE0 睿鑫网络 m r:~9I.b$p+\v

(1)控件类必须实现IPostBackDataHandler,由此可使该控件参与回传数据处理。睿鑫网络^(Fv#b%]Z6Q

睿鑫网络&n l9L9^KJx'y/~?

(2)定义属性Text,其属性值保存在ViewState中。当页面回传时,包含Text属性值的ViewState将被提交到服务器。睿鑫网络 t(?J k9]7Cw y o6C

睿鑫网络 _]7_;NbTAU

(3)重写RenderContents方法,并在该方法中定义控件呈现逻辑。

,lU3n"h9e:TCM{0

.D@)D(u"t0(4)实现IPostBackDataHandler的方法LoadPostData。比较客户端发送的数据值与先前服务器提交给客户端的数据值是否相同。如果数据相同,说明数据没有被修改,那么返回false;如果数据不同,则表明数据已经被客户端修改,则返回true。睿鑫网络nC J7Y%Vn

_"J!U3]'oA!m0pn0(5)实现IPostBackDataHandler的方法RaisePostDataChangedEvent。如果LoadPostData的返回值为true,则执行该方法,即要求调用OnTextChanged方法。

)?e~y-aj0

1K9lu ]&L'u0(6)定义事件属性结构TextChanged。在Events事件委托列表中,为EventTextChanged事件委托对象定义Add和Remove访问器。

Vt6mS7vJ/j0

^0x s,`4[%AB&t0(7)定义OnTextChanged方法。

(_P |,o7Z8I'k AVE!NV0 睿鑫网络Lg'e#g _.O

下面是应用自定义服务器控件的Default.aspx源代码:

'Q` e2G%Eq0

t t&HXja0<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

:r,S$SX3x\3Nl0 睿鑫网络j"CR"D BP

<%@ Register TagPrefix="wcl" Assembly="WebControlLibrary" Namespace="WebControlLibrary" %>睿鑫网络5v7J4e:J`Mc*o]g

睿鑫网络!`aoI\jH7xT

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">睿鑫网络xF!i)?$q

nB WE%K7mNk0<script runat="server">

@ M5A&jA2?p.Um0

j'n:ZeN1Fzvj0 void demo1_TextChanged(object sender, EventArgs e) {

$qE lea0

)M&Jy8J!lP0Pe"a"r6|0  label1.Text = "您在文本框中输入的是 " + demo1.Text;

d`1E|6tq2} i0 睿鑫网络&TO0?x"K1RKG

 }睿鑫网络h\2Je+C)t(D.m

睿鑫网络9l k~#mY"B

</script>睿鑫网络a&d]&yu6f#PZ

睿鑫网络?.J"b2I1a

<html xmlns="http://www.w3.org/1999/xhtml">

vp1\/i md0

y,O0J9B6|'l0<head runat="server">睿鑫网络/O*l4X&G"o

5mWl MaNvo0<title>处理回传数据</title>

[*R2G{+b{#L(fx1|0 睿鑫网络_'R&T-h H4t A~

</head>睿鑫网络6Nt&C/}1JV"F&xj

睿鑫网络:\n C#_'[ E!A1w

<body>睿鑫网络c uq6Hxmx

睿鑫网络+~M~v/{b

<form id="form1" runat="server">

)Q%D9i6[)\'T5N0

gZJA?0<div>睿鑫网络;t,ZL!hP m

ix7H @!h_0<wcl:WebCustomControl ID="demo1" runat="server" OnTextChanged="demo1_TextChanged" />

ebb*Nd r7A0

{~1Ww^*bt0<asp:Button ID="button1" runat="server" Text="提交" />睿鑫网络#|Z1yGV7O

_:_ VS+K*t/b0<br />

&ZL%Kdm,e2z#}0

6E.LY8LA0F+u0<asp:Label ID="label1" runat="server" Font-Size="small">睿鑫网络r#Y8b/A.\z

p[*\0M8uh)R0</asp:Label>睿鑫网络qiU3v3A

睿鑫网络d#t2bd^\/X

</div>

0zzh%FL6q0

M$dQ y\`0K0</form>睿鑫网络6t&`$J-Q-v'\#V%M

睿鑫网络s9`r[)`

</body>

cs:}W jQv4J1p)P0 睿鑫网络o1f#t5k2d @

</html>睿鑫网络+m3?#G X9fJ6_0g

8m7Xin;x6s0在以上代码中,定义了一个WebCustomControl控件,并为该控件定义TextChanged事件的处理方法demo1_TextChanged。该方法要求修改Label控件的Text属性值。效果图如图1和图2所示。

L*t[JM/U0 睿鑫网络VU2XZ+Oemd

-j[HT-c*rtX0

Q&ut#luP2|+B0图1 页面初始化效果图 图2 页面提交后的效果图

-b C#E1[7X'[0 睿鑫网络*j9R }7HWu5Z%c x;Dp

可能某些读者会产生误解,以为上面的实例定义了提交按钮的Click事件的事件处理方法。实际不然。本实例并没有为提交按钮定义Click事件的处理方法,而是通过处理回传数据,并定义WebCustomControl控件的TextChanged事件来完成的。睿鑫网络&s,mLD g,mu

睿鑫网络_Z@,]?:tc0g

3、小结睿鑫网络M;xbL i9h}Y9b-}

睿鑫网络7A&H3A8?Io+]

本文针对实现处理回传数据的实现方法进行了介绍。掌握这些内容将为开发出具有高质量的服务器控件打下良好基础。至此,通过三篇文章的介绍,相信读者已经掌握了为自定义服务器控件实现事件的基本方法。在随后的内容中,笔者将继续介绍利用ASP.NET 2.0技术创建服务器控件的其他内容。睿鑫网络V;h/X,d pz

上一篇 下一篇

网络资源