TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
0 w8 u9 `( ]/ ~( x. w& G求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
, Z* A' h+ I# L 1. ~ 的用法
! q3 W- V3 p6 i* b& f1 o 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
" n1 Z0 B* G' L式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不4 |# s# D7 _ @# Y( d- w) n& b/ l/ `
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
* x6 A V) b, D ~/image/about.bmp 0 h* C$ d" G ?5 k; C4 c
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
$ {, c# ~2 @( Q: |4 d2 u加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
) B8 Q$ o' R# E* S, ~它。+ s0 U8 Y6 _' e S4 c8 w9 K. D1 S
2. 在刷新和提交页面后,保存你的页面滚动条的位置' P( g! O# c }: S1 x
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
! H0 X7 `9 `: I0 M L7 u1 [' T用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸$ r0 f4 a0 K% U; q) f+ Z
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
4 a( [# l# n0 [; E: \: O* o- t也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370, a" {( y4 l. N1 V% d8 j) O
个控件又需要他选择一下?
; W4 S& Q3 I" E- R' d 用下面的方法可以很快地确定和记住你提交前的位置。
! d0 ^& x7 l$ S5 K0 o X8 n 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
0 f8 y4 X! l5 a p不过他使用了Web Behavior这意味着你需要使用一个.htc文件& ^) B7 o1 q9 s1 l) r/ G/ T
Private Sub RetainScrollPosition()7 n- s4 o. Z- M0 q$ k- t3 S+ g
Dim saveScrollPosition As New StringBuilder* D8 K# m1 ]/ t- m7 ]8 P, t
Dim setScrollPosition As New StringBuilder
6 P$ e- J. A, z E) A6 M! WRegisterHiddenField("__SCROLLPOS", "0")
5 J% s8 m+ {/ {& g1 @5 a9 @" [saveScrollPosition.Append("<script language='javascript'>")/ j! A1 I5 O1 s% f7 \
saveScrollPosition.Append("function saveScrollPosition() {")2 m' a4 J! X1 I. E2 q. e
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
6 J2 S! h; {. Y: X: K' hsaveScrollPosition.Append("}")3 G0 q$ L+ A! J& u0 a
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")8 y' b2 e, m7 c' a
saveScrollPosition.Append("</script>")9 L* a' U3 ?1 r p: I+ {/ G9 U
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
! U# c+ B$ b- z5 V: A- d$ eIf (Page.IsPostBack = True) Then; A) P, L+ z1 C: F' W& k
setScrollPosition.Append("<script language='javascript'>")
1 n; f4 K: w [% T& I# Y* ~9 M* ?; _setScrollPosition.Append("function setScrollPosition() {")! l. Q p6 |" B6 l( g3 E4 O- R
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
; z0 B: h/ r) {5 dsetScrollPosition.Append("}")
$ @* B& n, d1 g8 m0 [setScrollPosition.Append("document.body.onload=setScrollPosition;")
W4 j1 i" i5 l" PsetScrollPosition.Append("</script>")
& T% O6 a1 c G4 n3 d+ }RegisterStartupScript("setScroll", setScrollPosition.ToString()). G. n( n3 E+ E% }3 A) G
End If
# T9 |7 E: g( p% ~! ?End Sub2 R* T; Q7 h3 @% Z
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 7 |' J1 L0 U4 l1 j. D. I
MyBase.Load
) r8 X( M4 \8 x/ q, ^2 T2 ^RetainScrollPosition()0 k& Y" N) y& M3 |* G
End Sub , m! Y- }% b, w9 m% m+ V
& y; t2 N% J5 n* ~/ J. {7 l0 D3. DataList使用不同风格的模板
& U4 Z6 h$ `% }4 l' t# m4 C& V) u" P 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
) |4 b7 p& t' m" R! A4 K- L! K件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个1 z" V& h. X. y+ x" G1 r3 ^8 U
元素或是加一个促销广告图等等。
: y, x/ c- V1 \: n+ G; RDim theme As String0 ^7 p" S" {) X- L# v2 |9 H: e
theme = DropDownList1.SelectedValue8 f1 L* \. X+ o; w. f* A" J
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
+ w& H. I+ e& CDataList1.DataSource = DS
& M4 _8 d9 w- K U6 _9 O3 O, \& R' qDataList1.DataBind()
4 ~4 G, b8 G* a' E7 J2 n" S 4. 设置服务器端控件的焦点( X& T7 o h# u8 d Z9 t7 A0 @
Private Sub SetFocus(ByVal controlToFocus As Control)* A2 p" N. R! @$ B% }) I) w$ g7 r
Dim scriptFunction As New StringBuilder
( G9 z/ u( s5 r B. Q6 ]! J6 }Dim scriptClientId As String2 W( w/ I* e5 B; I
scriptClientId = controlToFocus.ClientID
4 A5 O2 f/ ]7 P. sscriptFunction.Append("<script language='javascript'>")$ p8 f* e7 F* A+ v/ F9 G
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();") M. `, k# ^1 r W5 s: U* x5 O
scriptFunction.Append("</script>"). R( M+ T. \" V& O8 a5 E
RegisterStartupScript("focus", scriptFunction.ToString())
7 k: m' r9 S$ b5 u" V+ ZEnd Sub% d& {# O* X! q: I9 N/ t7 |2 Z
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ' x) d% l2 y( e5 ~' ?
MyBase.Load2 F' R: [: D4 m$ c
If (Page.IsPostBack = False) Then
+ A" `1 I! ^7 J; ySetFocus(TextBox1)
+ i, ~& G: n) Y- r# J1 s6 m" zEnd If
& k" z, V0 Y- D# |1 G3 [+ sEnd Sub ) D% P1 Y1 B, o* E
5. 滚动DataGrid
: J/ c, \! }+ f# X) Y8 k 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只& O/ I% a$ N3 P! C% A
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
4 I! m8 i4 A+ g2 H件放在一个DIV中将overflow属性设置成auto6 y* D# x j8 ?- }* B. O$ \
<div style=“height:400px;width:200px;overflow:auto”>
3 k( @( F! ?" z; a X7 G& ?: P<asp:datagrid id=“MyGrid” runat=“server”/>
4 K6 Z0 W) C/ D4 A5 z</div> . `( k& Y4 I1 u2 C8 ~( P
6. 动态创建控件7 H! P8 A& c( X8 S i
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
) D' s3 J6 p- B+ A" M q9 \Sub Page_Load()
& }, F& l; x9 q0 W) rDim i as Integer
4 t9 s0 ]; U7 L6 Q. `7 dFor i=0 to 4 9 `5 H& U, W+ q t
Dim myUserControl as Control& ~! m% i- K- \7 s6 C8 ] H% q6 p
myUserControl = Page.LoadControl(“foo.ascx”)& p {9 j( o4 R6 S; P% y1 J7 ~( f6 x: r
PlaceHolder1.Controls.Add(myUserControl)
; V V4 y7 w Z3 c0 x+ DPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
2 w3 Z M1 R3 ?/ ]/ R' y- Y2 C' N' fNext i4 w( l2 f; i/ o, B, n9 o7 c
End Sub
/ j" [" `$ ^, p) }- Q 7. 客户端代码的使用; q; J" W' K0 k! }8 Z* }
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标9 x1 g0 c$ H$ q6 V& d$ d5 Z; Z% p Z
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
9 ~( c: g5 }' u8 R( S, P: Z+ y2 Y! |asp:ImageButton id=“foo” % F* R( ~7 m. O1 G( q
ImageUrl=“start.jpg”5 J5 K3 K0 \" P R1 F
onMouseOver=“rollover(this);”
; e/ ^- E8 C! ]6 g# v+ WonMouseOut=“rollout(this)”
. j, e( K$ L* |7 ~& _rolloversrc=“myrollover.jpg”
8 h$ D& c `3 k6 i b9 N* [rolloutsrc=“myrollout.jpg”
( x& O3 O. I% c2 E7 Arunat=“server”/>4 _8 p2 M: Q) Z8 j
<input type=Button onClick=“return clientHandler()”
8 _2 H- @& l' I8 B+ honServerClick=“Button1_Click” … />
1 K9 a9 H' x8 H. q x 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
/ d6 ]" s( _3 I: y3 _有的客户端控件。
4 w( |, C+ k+ c w; ^3 E& F" vPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 4 Y( \2 \' c% J: e+ s3 o; g& y
MyBase.Load
; D. o3 N& X& o* O' o RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")8 x9 l" o4 P& S: i! @/ [$ W
End Sub ! l' O, t, |, |% Y( S- ^) J+ i
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|