TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
) Z0 |4 H* I' A0 t5 T4 a求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。4 h' L" r! G/ O
1. ~ 的用法
2 d. {+ F0 d% m& g 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方1 r, K0 ?1 o h/ f+ a% [
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不$ ~7 ?, F+ C. f& k% a
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
9 h( ^+ o. O8 c- P ~/image/about.bmp # p7 `3 T. N: f" \2 N$ H
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更+ m8 M. D+ K; W8 n
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
- U: U& E+ v0 W; d- z6 v# q它。
! h0 ^. B) S/ a r/ ?) m 2. 在刷新和提交页面后,保存你的页面滚动条的位置
; F3 N' ]: ]8 u& ~ }9 | 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说/ i& M1 G L2 e5 q/ s
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸6 U# V: C$ V5 ~1 i4 s1 e% p9 B
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
' ]) C( l- _4 y/ B/ |也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370 r! A. w4 U6 x& o! m, r ^0 H% n
个控件又需要他选择一下?
1 I- m; P5 B+ f8 w7 v9 [ 用下面的方法可以很快地确定和记住你提交前的位置。: L' k' V; E, [8 f% D2 V8 D
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,( d# C) x1 S4 W* Z4 w4 \: y* n
不过他使用了Web Behavior这意味着你需要使用一个.htc文件! g* u5 D1 d/ h
Private Sub RetainScrollPosition()
" ]6 Q- _+ L, d% u+ y" c" ?" BDim saveScrollPosition As New StringBuilder
0 S+ ~- _. m# C! B( f( oDim setScrollPosition As New StringBuilder
& R m1 |& V# Y# q& M% S2 O2 @RegisterHiddenField("__SCROLLPOS", "0"): a: |1 n+ d+ T' K; b9 z# W
saveScrollPosition.Append("<script language='javascript'>")3 T9 D, P8 f$ k4 N( J7 z
saveScrollPosition.Append("function saveScrollPosition() {")
6 H# R( W1 W4 H* K$ n! R" t# csaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")- \$ s1 e+ s* s3 B7 Z9 Q" [" H
saveScrollPosition.Append("}") w% Y7 E* X& D% W9 O+ g& ~+ ?
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
; Y/ P# V6 Z' v. nsaveScrollPosition.Append("</script>")* y& k0 Q& M/ b4 Q7 h0 T3 m$ ?7 S# g
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())# B e) X: A, E! t" c' C
If (Page.IsPostBack = True) Then
/ v) y) f" N' a- y* ^4 R# s D2 v, hsetScrollPosition.Append("<script language='javascript'>")2 y5 m, ?% v' w6 t' _- j* p. V
setScrollPosition.Append("function setScrollPosition() {")% F p7 K/ }, v! r' Z2 ^4 g
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")3 t5 O$ @! m6 R0 y ^
setScrollPosition.Append("}")0 \& L0 v9 a6 G% h6 `( J/ a% c
setScrollPosition.Append("document.body.onload=setScrollPosition;"). ]$ @8 }2 C" S) _
setScrollPosition.Append("</script>")
; I& P0 E7 g5 s6 d- wRegisterStartupScript("setScroll", setScrollPosition.ToString())( n% v$ F T- ~+ {6 I
End If
, M& O+ S) I( a* w$ K" ?- ^% zEnd Sub W- O) q Z) ~1 O
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles " N' M- x+ e" X+ Q' {, L% D
MyBase.Load1 l t0 B- Q* _# a; q) v2 l4 F
RetainScrollPosition()$ d, J3 N4 m3 k: n: Q9 V8 ]( j% o3 o
End Sub 6 g4 V7 \6 e7 |. N) G2 O
3 s, Q* v) X \3 ^2 O7 K8 ]# c
3. DataList使用不同风格的模板, g* q6 H" v2 i, p; R1 T1 }6 r
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
) j5 n6 ^1 v' H, j! p件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
; d9 i/ v: h. h* X, R0 ~2 _# V9 Z7 N元素或是加一个促销广告图等等。
. h- o; X$ O9 l* `2 O# `Dim theme As String r% p1 l3 \$ K
theme = DropDownList1.SelectedValue* o5 J8 _; J5 w1 h, P6 V
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool. H2 {+ m6 h/ r
DataList1.DataSource = DS
/ A- V) e3 `' B; o- ~; J* p! |DataList1.DataBind() ! |5 `) B' f5 ~0 e5 k( K
4. 设置服务器端控件的焦点0 L+ T& ?) d' c! \& O; G
Private Sub SetFocus(ByVal controlToFocus As Control)( M9 g4 E( t/ J4 c# K: l
Dim scriptFunction As New StringBuilder
0 F1 s, w$ T4 C2 F9 FDim scriptClientId As String
- u8 d/ e0 V+ W. Q. t4 PscriptClientId = controlToFocus.ClientID
* M: _, d3 d4 s; v+ n4 WscriptFunction.Append("<script language='javascript'>")* P: ?5 x# O7 |5 i* L# E0 ^
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
# a6 ]- `/ ^/ b' ~' n' b& F3 t+ e& @scriptFunction.Append("</script>")* R5 {+ G3 {& u5 R- O
RegisterStartupScript("focus", scriptFunction.ToString()). H7 Y w9 b7 T7 L$ Z
End Sub
+ w& X: j: ^7 C4 r& T$ HPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
& w9 F5 g" f' k( S& Q) ~MyBase.Load
- c$ ]$ _, y, K1 d, rIf (Page.IsPostBack = False) Then# L& ] ^3 P p7 c8 I+ H" s
SetFocus(TextBox1)3 ^, v5 K. p/ Q/ l9 N2 H
End If
: h" F' Z6 W, n, U tEnd Sub
4 ~3 \; K9 J3 v 5. 滚动DataGrid
" L/ L/ Z ~5 _$ x0 O5 t' U, E- m 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只! q( o9 Y& C. O4 I
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控/ A1 p5 U" v! g* I
件放在一个DIV中将overflow属性设置成auto
6 a9 u9 K2 g3 c6 u<div style=“height:400px;width:200px;overflow:auto”>. h, x6 K+ y9 |0 T( Z5 j3 X) N0 i
<asp:datagrid id=“MyGrid” runat=“server”/>4 o) D* \4 J; N; ?8 N8 B" q5 o
</div> 3 E+ y f% C, o0 ~5 [ l
6. 动态创建控件 ?. A: N/ k* R3 d: M# X( z' z
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。 `* R0 X8 |2 n c$ V' t
Sub Page_Load()
, J! `) ^$ h; eDim i as Integer
] [. [) T7 E D# s# vFor i=0 to 4 " s8 \ J/ U( ?6 n0 I4 j
Dim myUserControl as Control5 {* |' Z- ^3 |8 M4 S; B( E
myUserControl = Page.LoadControl(“foo.ascx”); }) _9 Q, k* v) ` E" _
PlaceHolder1.Controls.Add(myUserControl)2 s% D) [: v& i0 z8 T( S. D" i
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
' W7 ^, H) H! s3 a3 S1 @Next i
- J0 p# Y: x: g4 w7 i R' c2 dEnd Sub # S0 q4 Y( g$ ~2 b. @2 V y5 A3 {+ T2 y
7. 客户端代码的使用% d1 r ?+ N! D" Q- ]% I- R
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标1 L% {8 l, l1 Q& l6 _- s& U
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性2 l* w3 Y6 G6 L4 A0 Y' X. r: d e9 u8 G
asp:ImageButton id=“foo” " x" M5 H9 l: @& E) J7 Y$ ]2 [
ImageUrl=“start.jpg”- l8 |7 Z; R) \% F' k
onMouseOver=“rollover(this);” . t$ G2 `0 Y3 Z
onMouseOut=“rollout(this)”, _& Y) q! B. n/ l- u0 n, z2 t
rolloversrc=“myrollover.jpg”
+ p# ]1 O! ]& Q" b5 `, irolloutsrc=“myrollout.jpg”
5 Q0 b; |6 E* r- H* qrunat=“server”/>
& Z4 |5 Y3 e: t0 k* `6 v2 Y( m4 h& U<input type=Button onClick=“return clientHandler()”
6 H9 ^+ D: i0 _onServerClick=“Button1_Click” … /> 2 a {" }& `& v* R, z0 q
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所$ O, p7 P E5 T, ]/ [" B
有的客户端控件。3 l% c l" | u7 Y: n8 @
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles % f# F1 Q0 B* L
MyBase.Load
! }) {7 b3 Y. m" p% v! X2 [% ~2 d) } RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
, K% G% q2 C8 u# r8 V' qEnd Sub
) p( n& C# N- j) k 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|