TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需6 B7 d7 A( x; z7 y @; c) t, v6 o
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。1 {6 h, r% c& l9 [+ ?
1. ~ 的用法
5 _, H! S' u- @4 a* G6 Q 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
+ l5 f8 l4 n; u" G* ?9 W# F式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
) ]9 Z+ K: T: Z" [# z' ~同层次的两个目录的aspx文件分别引用时,问题就会出现了。
8 a% p3 l( A+ o6 W! Q1 L# R% [: g; V" \ ~/image/about.bmp - K* V* [6 K1 z4 s
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更& t3 e/ Q4 b$ _ X# W! w' \
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
9 ~! o# V& D* E+ K它。
7 _% S7 J' q9 O6 o. c' X 2. 在刷新和提交页面后,保存你的页面滚动条的位置
+ n! J, J' p9 n3 J; f& A: c 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
" P, J/ o# o3 W9 F" f" C7 m用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸/ ]2 _% @ ?% _+ n! E' q
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方* x9 N1 y' b4 g ~: n0 l% X& t3 p
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
; \9 n+ N" s- y个控件又需要他选择一下?
( [6 N: ^/ a! X- S* g9 r 用下面的方法可以很快地确定和记住你提交前的位置。
: {! P$ g& Q' I* q4 ^) r. _6 z 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,% E8 R- Q/ j1 ?6 _
不过他使用了Web Behavior这意味着你需要使用一个.htc文件1 E% A% O9 E# n2 D8 Q7 g, _0 H
Private Sub RetainScrollPosition()
' l e; J5 _% v2 E: ?" dDim saveScrollPosition As New StringBuilder0 a: x, g o2 J+ Q) G- V8 Q; F
Dim setScrollPosition As New StringBuilder/ X9 i- x5 J/ A
RegisterHiddenField("__SCROLLPOS", "0")
$ `/ |/ I3 o6 XsaveScrollPosition.Append("<script language='javascript'>")8 {- z1 q* f' ]2 [9 X/ E
saveScrollPosition.Append("function saveScrollPosition() {")
1 ?, C0 k6 l! }" f+ j2 fsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
- E) p0 x0 _( [saveScrollPosition.Append("}")1 e8 U/ F" \' Y5 l( T* G
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;"); X/ I. R- F* h( G) h
saveScrollPosition.Append("</script>")! R$ y ~- R; j2 E+ F
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())' C3 f9 ?' h! t( s
If (Page.IsPostBack = True) Then
: f$ t( x: p8 A B6 j* R9 a4 dsetScrollPosition.Append("<script language='javascript'>")
3 j# T9 _' f9 ?0 s! |( BsetScrollPosition.Append("function setScrollPosition() {")
# @8 ~7 g- P* ~setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")' I8 i1 m$ z2 C. q+ Y
setScrollPosition.Append("}")8 W" r& c- X4 X( Y# A6 j0 j
setScrollPosition.Append("document.body.onload=setScrollPosition;")
4 u. `2 \- H% T: BsetScrollPosition.Append("</script>")
4 t) X, n @$ r6 aRegisterStartupScript("setScroll", setScrollPosition.ToString())
6 P5 i# m; H/ a0 L9 ?End If+ l- X0 k$ s& K. J2 n/ ~/ L
End Sub/ N0 F j" v2 v
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
5 E6 O0 r3 i7 h9 M4 G! n+ QMyBase.Load. q5 q* `* _1 q: |% c
RetainScrollPosition()
; H7 B2 Y [# d2 kEnd Sub " N7 ]' Y" b4 r+ u3 N4 [4 A1 _
5 A) X& U8 \! U# }% d
3. DataList使用不同风格的模板
, d! F" ?7 C! B1 r 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条* d! s& K6 |+ I4 g4 H- H! S- S
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
8 H, l. B- ]7 V3 u+ i元素或是加一个促销广告图等等。! l P ]( W4 Y- V; m; G1 }
Dim theme As String! a- e+ t7 ?# b8 D$ T
theme = DropDownList1.SelectedValue
7 }% `6 f) u# ]3 s2 |" \" U8 PDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
9 \/ q4 l% s, R0 j' v$ J: J' ?DataList1.DataSource = DS$ s) L! m0 N2 A4 c
DataList1.DataBind() 5 Y3 Y6 q" n0 J2 y. n- ~2 K$ H7 e
4. 设置服务器端控件的焦点2 X/ ^& H& M7 ?" b
Private Sub SetFocus(ByVal controlToFocus As Control)
8 k% a6 M; V# Y4 F% |Dim scriptFunction As New StringBuilder
; m9 S9 ]7 w' _Dim scriptClientId As String8 |! w* i0 D( E& z. Z6 W1 Q
scriptClientId = controlToFocus.ClientID, L7 B! K! C p8 F3 _; g
scriptFunction.Append("<script language='javascript'>")3 d# I/ W8 V% L! X2 s$ `
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")9 W" d6 n* w6 k$ ]% |$ b, R
scriptFunction.Append("</script>")
0 z7 Q! o/ C6 T$ Y2 ]* ERegisterStartupScript("focus", scriptFunction.ToString())8 g( Q: r2 P! u. @
End Sub
9 v. F# v3 f; E" A2 ^* dPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 2 S6 C. t: Y+ ^6 ?/ Z* S
MyBase.Load" Z- ] i* B9 o5 G Z' R
If (Page.IsPostBack = False) Then
C6 M5 d b3 N3 F, M8 e# vSetFocus(TextBox1)8 d/ I7 e+ H, ?* r
End If$ A. O" Y" e/ ?/ h
End Sub
* d7 J3 @4 b" r# j3 ]" N 5. 滚动DataGrid- e# V5 U- h: P2 x
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
2 ~- E! X, N5 \! [1 Q有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
/ V( S! c" l* Y& ?( t p# ^件放在一个DIV中将overflow属性设置成auto
& x) s1 K. {6 W0 z<div style=“height:400px;width:200px;overflow:auto”>
* O9 M$ ?% _( N* q( `) ~<asp:datagrid id=“MyGrid” runat=“server”/> I4 w8 e, k1 l8 R4 d( ~
</div> # Q! U" P; W( T! ^' C
6. 动态创建控件2 a" N1 V. }( X2 R" W
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。! D% v7 Y" Z8 ~4 C* f& N2 z
Sub Page_Load()5 y W6 ?# p4 T1 l
Dim i as Integer* v, |; M2 Z9 c4 B0 D2 t# u
For i=0 to 4
/ n* P( z+ |* L# d. R$ N, b2 }7 [Dim myUserControl as Control
& Y/ \+ U: r6 QmyUserControl = Page.LoadControl(“foo.ascx”)% ~ k+ U& V) ^8 m% V, I( D
PlaceHolder1.Controls.Add(myUserControl)2 |4 o- O1 A8 j$ r' Z
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
6 o4 Q2 [3 d1 s. a5 I7 _Next i; W- y r& a3 I* M, t
End Sub + E, O+ _" ~5 W3 d
7. 客户端代码的使用
( u, R" @& J' I7 Z7 Q# m6 X! i 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
" D5 E* c- `1 R% {9 A2 E% y准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
4 }. E3 u4 a) G7 f) w0 }asp:ImageButton id=“foo” ) |- W c- X8 i& J, G4 s& N/ O
ImageUrl=“start.jpg”4 C9 v/ @: ]0 ] I+ R
onMouseOver=“rollover(this);”
7 [# K* O. D7 N2 p' L, AonMouseOut=“rollout(this)”7 w: l- T; f; O0 b0 f2 J- R* x
rolloversrc=“myrollover.jpg”
' P8 W* m# _; V0 e0 {4 A( k5 \* prolloutsrc=“myrollout.jpg”' K7 E& o2 }! ], P: w3 G
runat=“server”/>
- @/ _' i8 |9 y7 k' \9 A4 |<input type=Button onClick=“return clientHandler()”
0 [% _$ ~) `/ Z4 B* aonServerClick=“Button1_Click” … />
. J# p' q/ |9 w$ j5 R 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所4 p3 G* v6 N1 Z4 u; R
有的客户端控件。
& x2 f* U) \4 t/ o. C" O, fPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ) ?. v6 u+ I5 p5 d3 t5 R
MyBase.Load" q; k C ?: w0 k2 x" s
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")- e4 k/ I9 t) L8 z! c$ E2 y
End Sub
. b! f8 l, w5 s3 F% H 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|