TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
2 f& C X# l" B2 {2 l求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
+ ~* B0 `! ^% M- V) L 1. ~ 的用法
' g9 w) [, n: }9 }/ v- p 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方' m5 b: K$ ^; x+ p( T0 g+ o
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不& I1 f- z; v6 g' h* h; w; _. Z0 D- x
同层次的两个目录的aspx文件分别引用时,问题就会出现了。; D: r' z% Q( h& \
~/image/about.bmp $ s- ^2 J0 }6 z
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
8 v3 ]' t8 T& G# B) O加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览0 @! o& c" N8 I7 P2 B) j0 P
它。8 ~: e/ \) G2 M$ y$ u4 ^6 L3 v
2. 在刷新和提交页面后,保存你的页面滚动条的位置
5 e/ F. `* [& a" L$ E 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说! ^6 ?9 `; U. _3 O6 p. t, K2 m" E
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸4 H2 W$ G; E7 L F( f
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方4 s- S& c2 s6 q3 B$ w
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
( p# L5 w) D1 ~. o' G" G- e个控件又需要他选择一下? 1 Q |- B* v+ X3 ]* s) Q: X& ?
用下面的方法可以很快地确定和记住你提交前的位置。
5 K% z2 P! L5 [: Q4 ^$ a 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
+ `8 ]# j! P, I0 D4 |+ w2 J不过他使用了Web Behavior这意味着你需要使用一个.htc文件
7 {, T- i8 k% R7 q5 JPrivate Sub RetainScrollPosition()8 o$ ?$ H1 W5 p9 `5 |
Dim saveScrollPosition As New StringBuilder
9 T2 l- W6 n' G5 b9 tDim setScrollPosition As New StringBuilder/ M3 s# b# z; C: R' T+ M
RegisterHiddenField("__SCROLLPOS", "0")
3 V2 c. q* z* @8 `: u; asaveScrollPosition.Append("<script language='javascript'>")1 z5 j- k* S0 e0 h0 k* ?" u) B
saveScrollPosition.Append("function saveScrollPosition() {"), j7 p! g* K1 \( E
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;"), H6 m8 `, y0 W, n8 n: m% k& Q$ O
saveScrollPosition.Append("}")) ]. t$ a/ z' W- _2 s
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")5 l1 [( a+ {. H; g! s
saveScrollPosition.Append("</script>")3 S1 d4 e# c: S8 e/ ?! T
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
4 @; h2 i) N& ^! nIf (Page.IsPostBack = True) Then
0 t" S- k" N. i7 IsetScrollPosition.Append("<script language='javascript'>")
7 S8 U% p# `" C$ V! ssetScrollPosition.Append("function setScrollPosition() {")
; s& I. b n6 h1 P3 E; asetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")/ L; [: _- Y7 L4 W' Z# a% ^
setScrollPosition.Append("}")
% I6 B6 c7 ^7 i7 Y, p( JsetScrollPosition.Append("document.body.onload=setScrollPosition;")
7 T) ?0 k7 O# `6 EsetScrollPosition.Append("</script>")
4 d# }; S4 |) z3 I' v0 S" ~" \' IRegisterStartupScript("setScroll", setScrollPosition.ToString())
( c2 ]* n' i* x) LEnd If
1 E+ h2 K5 X! w$ X! x6 O4 bEnd Sub
% K. N* U8 u* u$ A/ ?) _, n- }! IPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 2 [ `/ C7 c7 X! v
MyBase.Load
/ g! Y3 ^ J6 [1 m: [* B3 b4 |RetainScrollPosition()9 m0 g5 O1 \" [0 X; {% ` ?
End Sub
" \8 o; C: K( Z) F
6 w {4 i1 y2 k4 Z3. DataList使用不同风格的模板! _- V/ n x# J; D) O E
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条( i S' Q' u$ v, N2 a+ u
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
. d$ y) C, H( m& }元素或是加一个促销广告图等等。
! w+ T4 o0 U* NDim theme As String
0 `/ R) E: S0 V6 w1 N7 Ftheme = DropDownList1.SelectedValue5 R H* m) `: \% a
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
) L/ [1 k* C; q5 p+ Z6 F" y+ EDataList1.DataSource = DS
; ~' Y7 |: Q9 I/ Q2 k- Y' Q+ C! x. n$ UDataList1.DataBind()
# T3 D& j& v0 M% ? 4. 设置服务器端控件的焦点
2 N% Q- v6 d. I8 N5 z* [8 @$ rPrivate Sub SetFocus(ByVal controlToFocus As Control)$ Q8 K: X+ Z; R/ R. g" ~2 |
Dim scriptFunction As New StringBuilder
0 @5 A: K. u9 s" ~2 [Dim scriptClientId As String" w# g- o4 J2 q& O# K8 P( S3 y7 v
scriptClientId = controlToFocus.ClientID
5 b. ~5 n8 t1 gscriptFunction.Append("<script language='javascript'>")1 I( K4 q k/ I% C' @8 |, g+ d6 E; T ~
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
4 H+ A: ~- Z" K& i& N5 r6 escriptFunction.Append("</script>")1 q( a N( g2 k" X: c( a3 n4 x
RegisterStartupScript("focus", scriptFunction.ToString())5 O' F2 \1 [9 `' G* N, M! z5 X
End Sub
3 P* x+ v% R% s3 ?- zPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
' x0 X8 [7 K+ o2 ]/ \% _* D1 {( OMyBase.Load7 y7 \6 A; `/ i/ L2 y
If (Page.IsPostBack = False) Then
" S) l! F# E r d8 u0 L+ |SetFocus(TextBox1)
# T% ?, a( D! @# F0 N5 s2 X5 uEnd If+ A/ s' d! B4 ~; _ c6 ~
End Sub 8 }8 {1 l! E9 U
5. 滚动DataGrid/ g3 E" D, m' W6 [% Z
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
! V* a8 L% u% |, a$ w7 d有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
$ ?7 t. A# ?. T: e: H件放在一个DIV中将overflow属性设置成auto
% [2 V+ H* @8 i' U* A<div style=“height:400px;width:200px;overflow:auto”>3 t+ w" ~; f$ m1 u+ V* B* C' P: z
<asp:datagrid id=“MyGrid” runat=“server”/>4 c9 p2 T7 T3 h& l! L. l5 [; B
</div>
* }; B1 \6 Y$ Q7 e; N* [ 6. 动态创建控件6 q y: W+ y+ J, e" z9 X6 b
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。 h! ?& _- ?1 z4 H5 O' s
Sub Page_Load()
! y5 W* v: `1 t$ `% ZDim i as Integer4 `$ h& n6 [' w! e' f, S& H
For i=0 to 4 6 D% r5 U" p, A) B$ a4 c
Dim myUserControl as Control
) U0 B& d9 e$ Z/ q: h+ PmyUserControl = Page.LoadControl(“foo.ascx”)
/ j0 Z/ j2 J: |& B7 q- fPlaceHolder1.Controls.Add(myUserControl)) y1 X0 t2 Q* w2 z2 e
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
/ h: b0 W3 v3 [6 e+ n9 YNext i! |( S" ]; p; p# F$ k* K
End Sub 8 H U& I% V3 O& H+ Z; f
7. 客户端代码的使用
. D4 j1 m! m% M) K# j 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
2 J) _! [, S/ R% F% i准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
- a! L* I! f6 aasp:ImageButton id=“foo” 6 M4 \7 M" z7 q) V
ImageUrl=“start.jpg”
) j, ^: u. m2 \" t- y+ q+ jonMouseOver=“rollover(this);”
0 |) p" M8 l" D y$ KonMouseOut=“rollout(this)”
# p0 e3 _+ D- _8 Z' }% i8 z4 ^rolloversrc=“myrollover.jpg”- h) c" ?/ P$ k! h/ ~* N
rolloutsrc=“myrollout.jpg”
( b, s$ A# l9 E' }: J Xrunat=“server”/>
4 Y7 S2 X. f6 ^: E* [+ M<input type=Button onClick=“return clientHandler()” 3 ?( [0 H- {6 j& ^/ V: L
onServerClick=“Button1_Click” … /> / K5 A0 V6 P0 K+ m0 X/ p
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所$ A2 O6 l5 S, F3 ]
有的客户端控件。( C% S( N; Y8 C& C1 }
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ( H+ l( s/ ]$ H2 s4 h8 r
MyBase.Load7 P' w1 I6 k) ]' N( z9 r
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")5 g& L( P, A8 z2 o6 F* R u* w
End Sub
8 u& r: _5 Z* X 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|