TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需) _" _5 y7 g+ G* Q/ w
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。6 d! [3 }/ b3 f ?' ]7 C
1. ~ 的用法
, V( E4 o" R8 R! W+ w5 B6 Z, f 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
( W k7 U g0 _$ ^/ x5 f9 ]式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
1 e2 t; l( T# l7 R同层次的两个目录的aspx文件分别引用时,问题就会出现了。( v& ]7 n7 ?$ a, c
~/image/about.bmp 3 t$ c% V! f5 J9 I3 q. U
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
% r- k" T0 D5 H, I3 M- S加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览; }- w- q' @, Z& W5 F7 v* K4 k& n
它。# r" [5 S% R g
2. 在刷新和提交页面后,保存你的页面滚动条的位置
% t: _5 B0 W0 y# H& D l( m 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
! v% B; b, ~, u7 V7 U0 J用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸- t; B5 s0 P( m) Z
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
! F) R& N r2 v9 w也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
$ j$ A5 Z- @3 w2 r个控件又需要他选择一下?
) g) T, E% _9 |+ w0 k* e 用下面的方法可以很快地确定和记住你提交前的位置。
7 w$ T& W6 M/ s: r/ W- U 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
7 }3 I) F! [/ q( c8 D- p* C不过他使用了Web Behavior这意味着你需要使用一个.htc文件
( w( i- c) D6 [% G0 h) R8 {: pPrivate Sub RetainScrollPosition()
8 B% s# H$ E, J0 W5 H1 w) s$ iDim saveScrollPosition As New StringBuilder
, n0 R, ?+ {" Z% ? T X! K3 K& DDim setScrollPosition As New StringBuilder
5 A- a" j; }+ i, s3 Y* YRegisterHiddenField("__SCROLLPOS", "0")8 j* d7 F( M3 q7 H+ i( s
saveScrollPosition.Append("<script language='javascript'>")- Q3 w9 p/ ?& E2 \$ @$ C7 m
saveScrollPosition.Append("function saveScrollPosition() {")
; F2 y" a5 S# m0 `& Y$ h# j4 WsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")3 _, T( Y1 t1 U4 }) k% A; r+ L
saveScrollPosition.Append("}")
- g2 {% y% Q6 \) p, v8 h1 [saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")7 p7 d+ E! o& T1 t+ R+ K
saveScrollPosition.Append("</script>")
& d# J+ D& M6 O) O$ jRegisterStartupScript("saveScroll", saveScrollPosition.ToString())9 g0 G3 Y4 k }4 b
If (Page.IsPostBack = True) Then
, H! B0 V% c( U" ?! YsetScrollPosition.Append("<script language='javascript'>")
) X; N2 M: ~; `2 }# R/ h9 x }setScrollPosition.Append("function setScrollPosition() {")7 [; @+ c d" ?+ D# p- i) l
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
8 y/ O& s. l* j/ T' n5 @# z6 CsetScrollPosition.Append("}")
, N3 ]3 B* \9 V+ asetScrollPosition.Append("document.body.onload=setScrollPosition;")
* z. u& E0 f7 o% L( S/ WsetScrollPosition.Append("</script>")
" s" c& i0 E# [ {% NRegisterStartupScript("setScroll", setScrollPosition.ToString())+ P# u: ? J. l3 U9 H* N
End If
# g9 r( ^* v6 r; \2 v3 ~% g/ _* k- R8 pEnd Sub3 W, K, Z7 E4 T! y
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
3 w" w' i7 e: t. u4 l, b2 c7 qMyBase.Load6 K! Y% j+ Y; j: {
RetainScrollPosition()" [) t# n \0 o5 B2 B
End Sub
2 N8 V2 c. f& k' `8 l" J1 c; T7 x- W/ A, h" Q3 l9 C
3. DataList使用不同风格的模板
2 c3 n `% X' S2 W8 R0 @5 \9 ~ 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
9 w6 q: P( ~& l; E9 z件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个# p+ {. n$ h+ h" E! `& a
元素或是加一个促销广告图等等。
/ I2 r0 E8 u' G5 q/ T; F7 `Dim theme As String
+ e) f7 V* n3 |. Qtheme = DropDownList1.SelectedValue8 ?$ q. m5 [, g: x9 M
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool! f8 }6 b$ \. a! w1 R: Z
DataList1.DataSource = DS- N# j8 |5 z& q; l" [
DataList1.DataBind()
" x* y5 L0 y. W 4. 设置服务器端控件的焦点
: ]: M; I* I" J5 A0 w) @0 CPrivate Sub SetFocus(ByVal controlToFocus As Control)
4 A" A) j/ J( p8 a" U* pDim scriptFunction As New StringBuilder
8 B: w! o! _) } c$ WDim scriptClientId As String
+ K( z; q s+ u2 ]scriptClientId = controlToFocus.ClientID
5 t" E4 M/ b, A7 r2 VscriptFunction.Append("<script language='javascript'>")& g( w% \6 l5 Q' H# k( x; j( S7 B1 j
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
1 j9 z, j a- K+ Y# ]scriptFunction.Append("</script>")
5 @: W- [$ n. fRegisterStartupScript("focus", scriptFunction.ToString())
. L% ^9 ~& K# A8 u1 J- ~End Sub; d' {8 I+ R2 W9 b7 X
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
' }+ h9 k- Q f( |- T: a6 T3 }7 Z) C' {MyBase.Load/ t$ v* f0 n7 Q3 V W
If (Page.IsPostBack = False) Then/ I: q% V) B% X; H) J* _
SetFocus(TextBox1)
3 S2 ]9 U9 l) a8 pEnd If1 M8 y: `2 b4 H( k0 r3 w
End Sub 5 A4 G( K$ W! K" E- S
5. 滚动DataGrid0 I7 H6 k) c. `6 Z6 r& P
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
- B4 k# z. `3 O! a9 _; W有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控 B$ x) t: l% Z
件放在一个DIV中将overflow属性设置成auto
+ f: V u5 u6 ~9 K<div style=“height:400px;width:200px;overflow:auto”>3 |; ^/ x" q' [8 {6 q
<asp:datagrid id=“MyGrid” runat=“server”/>7 {' _- I) n/ j0 V3 B
</div> 0 T, t3 t, L- u7 U9 o2 t# C
6. 动态创建控件
: l6 c* R( j& l. B 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
8 T( i& W/ G1 w# ~Sub Page_Load()# Q' Z% P4 O7 [8 F D9 \- b5 t. r
Dim i as Integer$ o, t" c4 v$ R1 w
For i=0 to 4
) K6 G4 B! z! W- _: uDim myUserControl as Control
) E& w4 j8 E: o3 R9 m, lmyUserControl = Page.LoadControl(“foo.ascx”)/ M5 U% O, g( G6 D
PlaceHolder1.Controls.Add(myUserControl)
1 E8 J! W2 e6 a8 KPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
- c8 I* B1 N2 U, d- f/ KNext i( j1 o6 i- y8 c5 h' e$ C
End Sub # x- ?* G: L- ~& O
7. 客户端代码的使用
" H4 V" M: v4 c* H1 M 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
( ~4 e, U6 d$ g9 b' `$ ]- l2 X8 r准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
) G' L" d+ w6 ^5 X+ Jasp:ImageButton id=“foo”
0 s( X i$ k% i1 I# ]' rImageUrl=“start.jpg”9 K7 D3 G" d- h' I# r
onMouseOver=“rollover(this);”
; r- A9 j; v8 |) u8 v& eonMouseOut=“rollout(this)”- a& @2 b% v- F' v- l) q' M
rolloversrc=“myrollover.jpg”+ k+ e- P. B' S! o3 Z+ j
rolloutsrc=“myrollout.jpg”
6 p. R! d% i# X! S8 l. Wrunat=“server”/>
, R/ O5 Z5 W, {<input type=Button onClick=“return clientHandler()”
+ w, }( L: A5 @, ~6 \onServerClick=“Button1_Click” … /> 4 D! i/ c* }& g. l+ r0 h3 ~1 r
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
: S7 P) {3 P( ~5 p1 y$ t有的客户端控件。
% Q. A4 n& x; w' j; k6 WPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
7 z: z0 A1 P$ f( C' K* ]. v- WMyBase.Load
) t! I& j& f8 ^% e2 b, d RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
& B, {0 `; q" t O0 bEnd Sub
& c4 F1 N0 _7 ~- V6 A1 x2 X* j+ {; X8 E 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|