TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
. k5 N' O4 z c( [6 V3 l3 J6 [7 X求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
S: g+ [. d9 f 1. ~ 的用法: q! h3 Q* b( [4 ]
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
1 U5 n! D& N. x7 q) s+ z; X式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不3 N6 v/ Z0 k4 f# r! D9 T2 e) p# q
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
3 Q' c' v- H! w/ p5 K. Z# a ~/image/about.bmp ' T) y7 r+ g) b, Q- f
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
1 z8 a0 r# a- ^7 x+ j0 u加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览9 M' Y! a; ^4 r0 g7 v* N
它。
, j- O7 ?: C( g- E0 e' E 2. 在刷新和提交页面后,保存你的页面滚动条的位置! S) `/ o: {7 b- k& n G
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
; b$ G% Y% S# e( W5 k: h用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
) R( a% e: h0 f# N6 F: h0 M# u1 S组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
1 r: ^, U- v' }; L' O3 Y也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370# Q* y R# k# L
个控件又需要他选择一下? , Q5 Y+ m& f( k) |+ d- d4 l) R" B& B
用下面的方法可以很快地确定和记住你提交前的位置。) T6 v- n$ b$ H0 E2 W# h) T
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,- f: |2 _0 L3 A6 o( @9 o) B" E
不过他使用了Web Behavior这意味着你需要使用一个.htc文件3 \& V2 `1 L6 h* @
Private Sub RetainScrollPosition()
! @2 K& a& G/ H! a: U7 K; ?Dim saveScrollPosition As New StringBuilder% y" a; D: e: O; U; y4 p! k9 T$ E
Dim setScrollPosition As New StringBuilder- @: ~9 i; ?8 [) y+ {/ \2 h
RegisterHiddenField("__SCROLLPOS", "0")
a9 R' e( P' _' z' A" P' hsaveScrollPosition.Append("<script language='javascript'>")
1 z8 _, N; N) F+ FsaveScrollPosition.Append("function saveScrollPosition() {")
|' E" G1 N4 ksaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")$ S; W7 p/ \/ ]4 I+ X6 Q
saveScrollPosition.Append("}")
# u5 q0 z# |) f% r* M2 DsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
8 w7 ~- b" n* q4 g2 osaveScrollPosition.Append("</script>")$ x. q# V8 f1 b
RegisterStartupScript("saveScroll", saveScrollPosition.ToString()). m7 d( G! s5 J$ M' z
If (Page.IsPostBack = True) Then
7 Z) r6 c8 T4 E2 L& ^% _1 rsetScrollPosition.Append("<script language='javascript'>")
/ `- h9 \1 A" E' e, E0 G1 q+ |' U1 u. J @3 PsetScrollPosition.Append("function setScrollPosition() {") H. s. t- |: J7 `1 }0 l2 e
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
( [) T C7 d D7 `4 r, L: o3 rsetScrollPosition.Append("}")
. b w+ Q+ A2 |* U1 jsetScrollPosition.Append("document.body.onload=setScrollPosition;")1 X) O2 c7 T7 h$ u" m% z
setScrollPosition.Append("</script>"): G( l, N: M' t
RegisterStartupScript("setScroll", setScrollPosition.ToString())
$ z9 a# o- ^! X m9 ^End If
# _1 a0 n6 q$ H2 O+ t0 ]End Sub; G# x% t' k ~; E& u
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 2 [7 t! a6 s1 [* q1 h
MyBase.Load4 B9 n; ]2 G4 t, t0 n' Z
RetainScrollPosition(), V W; y( [) Z1 X& G* [; x5 D
End Sub
* M9 y' D$ o& I- p+ E( z' p f5 X
3 v6 i W$ l9 a* b, l& s2 H# ^" N0 ?3. DataList使用不同风格的模板
' S8 [3 r2 \# S( N3 e5 m 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条# v6 I8 x5 y' }" M
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
+ g x7 J! H% q' C元素或是加一个促销广告图等等。8 w- p6 ]7 d4 N3 v
Dim theme As String
- Q/ e/ s; ]9 o( Q, Wtheme = DropDownList1.SelectedValue
6 v- r) J% m0 c7 R4 V3 `DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
# q$ c# _( @1 P% I3 f7 I( TDataList1.DataSource = DS) R( w2 t- q7 V" Q4 _% h
DataList1.DataBind()
3 Z) V0 A" f5 ^* s7 z 4. 设置服务器端控件的焦点
7 ]2 c% {) c: a# e( y" j" hPrivate Sub SetFocus(ByVal controlToFocus As Control)
1 [" D* J) x) tDim scriptFunction As New StringBuilder
9 N# q0 N2 O8 f3 Z; {) sDim scriptClientId As String2 u _4 f" D. Z5 h! n7 O3 E
scriptClientId = controlToFocus.ClientID* ?- V# x- A$ i
scriptFunction.Append("<script language='javascript'>")
7 d& i2 r, T( }4 |. e, yscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
- L/ }0 }5 w; V8 ^( a. r& vscriptFunction.Append("</script>")
. w. A; o, l( F7 P$ hRegisterStartupScript("focus", scriptFunction.ToString())) a7 T0 q( f6 f' g' M
End Sub) }% J" ?; ^3 C) k0 _
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
- l K% D5 y; W* N( V' M! PMyBase.Load6 e( J0 v: m4 H/ d
If (Page.IsPostBack = False) Then
+ f5 Y5 k/ M2 K- ^SetFocus(TextBox1)
9 [ d+ W8 f) N3 _( zEnd If/ u; q( c- F6 G; ]
End Sub
0 l. ]% _% n2 s 5. 滚动DataGrid6 I4 e( Y5 w0 D/ S. s: g
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
2 o3 Y" |4 p1 Q. w有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控( m$ n) n8 `: M: Y$ U4 r$ c
件放在一个DIV中将overflow属性设置成auto/ d0 _5 g; L' m3 @/ J* C
<div style=“height:400px;width:200px;overflow:auto”>
! {4 ]4 o, u& J( |1 h<asp:datagrid id=“MyGrid” runat=“server”/>
) b) P& }. G ?2 j" `</div> : W2 S/ M6 a, |+ z& L6 h
6. 动态创建控件
: ~' I, A# d" [, \# ^! [# y 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。/ G: d, P5 U$ u+ o
Sub Page_Load()
6 o8 ]6 C) G, c1 J2 _$ EDim i as Integer4 b) ?, s8 W% `; t( m0 E
For i=0 to 4 6 f. z8 `6 f$ i( J
Dim myUserControl as Control; P) G# P/ ~# p M q8 J W- B5 z
myUserControl = Page.LoadControl(“foo.ascx”)
1 ?4 k+ O5 n! MPlaceHolder1.Controls.Add(myUserControl)1 E+ k/ ?6 Y7 b3 g& {& k: K
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))" l, T: v/ M% Z
Next i) a- x+ p$ W- z, |8 z2 ^. n. {6 }
End Sub
2 s% Z: z, m* S$ P; [5 m. { 7. 客户端代码的使用# R5 l' N. m2 W& s. Z9 [1 `
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标' q2 m! n: U( A: E9 J5 e( G D) G
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性7 r# R7 ^' y& L8 ^; O& C4 W
asp:ImageButton id=“foo” ! t- {1 K9 w' ~! I% A$ E
ImageUrl=“start.jpg”% E1 m' u0 B& ^5 O) P/ H
onMouseOver=“rollover(this);”
4 Y2 t0 v ], g; k3 d! ponMouseOut=“rollout(this)”) g" H6 y& {- q C0 I n) N
rolloversrc=“myrollover.jpg”
1 z5 ]7 \2 a( c7 i" g) Q3 U$ f. `+ s) z+ Zrolloutsrc=“myrollout.jpg”! K2 ~) ?" u7 K, R0 B& D
runat=“server”/>: d# d0 @3 J$ I ?- q$ @$ Q* H
<input type=Button onClick=“return clientHandler()”
" `$ P: y/ S. Y/ m! v- H" w! UonServerClick=“Button1_Click” … />
6 d5 Y! j4 S l 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所$ f" U/ Y% l- @+ A5 D4 _6 Q+ u
有的客户端控件。
: o+ f) r2 F$ b# [Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ! b# o, q% k+ I$ i
MyBase.Load4 c% H! v7 }2 E1 N6 K9 @
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")) a% c6 k0 E7 z- W4 v- ?2 R
End Sub ' { Z% q& G* c! k+ N: o
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|