TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需* E7 ?1 \: Q6 P. X( ]4 y% c! h
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
6 b2 E9 Q1 _ h; f 1. ~ 的用法4 V+ ?* M N3 h5 U/ j, F) ]( T8 Y
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
' {* g! U. }- |, ^式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不" D7 h# K. N* s
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
* A! E$ Q- E" d! r! o: g ~/image/about.bmp
) K, K6 R) _) r; ?是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
: g' F+ }, v& T加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览4 @! }& a% z0 b4 ]2 }: k8 `, d
它。
1 m+ V, J4 f; A: I 2. 在刷新和提交页面后,保存你的页面滚动条的位置; g( K1 W# q, |. r$ ~, D# b2 X
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
( n+ B6 X* l# ^7 Q, p用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸, B7 b3 J l. N
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
: Q; ^2 T6 E4 S# L5 E/ i$ N6 w也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370' s% G5 O$ n- |4 ?& X+ |
个控件又需要他选择一下? # O! r) a7 s, }( v7 }+ z$ f
用下面的方法可以很快地确定和记住你提交前的位置。; N; s$ e- x, x, u/ J4 e
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,2 Y8 C! l: M. D! O" z" T
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
9 b& a) w) H/ J8 I# h7 [* QPrivate Sub RetainScrollPosition()7 q1 v4 V% ]$ }7 @% E: c
Dim saveScrollPosition As New StringBuilder& _7 e }8 V3 i
Dim setScrollPosition As New StringBuilder
3 f; l2 I0 f5 N' w! @ J8 ]RegisterHiddenField("__SCROLLPOS", "0")
$ c. W) S) K9 L9 I5 WsaveScrollPosition.Append("<script language='javascript'>")9 I6 L! G: v$ T$ p( g1 l7 ?
saveScrollPosition.Append("function saveScrollPosition() {")2 a1 Q3 y6 n0 i
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")1 m4 x# Y. ]+ I& V/ j! n) {$ F
saveScrollPosition.Append("}")- y' V- F& c& ?7 O" O. q
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
( X6 x" y4 }1 T% a, U( IsaveScrollPosition.Append("</script>")+ A: J; x1 V: K5 d( S1 P
RegisterStartupScript("saveScroll", saveScrollPosition.ToString()), R8 r$ e' ~4 S2 I. ^
If (Page.IsPostBack = True) Then V$ U2 j0 A8 o- _4 y, M
setScrollPosition.Append("<script language='javascript'>")8 D4 g9 H3 Z G/ C2 ~
setScrollPosition.Append("function setScrollPosition() {")/ M1 @5 R2 P, z0 @6 S( a
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")) O; j/ i/ o4 q" p6 ]: f- o! Y- x
setScrollPosition.Append("}")
( L! i, T$ M. a. ^) X: X2 |) OsetScrollPosition.Append("document.body.onload=setScrollPosition;")1 M S& J* I( Y0 ?. G
setScrollPosition.Append("</script>")
6 j2 Y2 W. i5 u8 cRegisterStartupScript("setScroll", setScrollPosition.ToString())2 f4 @0 r+ n2 }7 o8 ~; L
End If
, ?1 a6 c/ B& g4 P+ JEnd Sub
, Z3 x: I4 M' [8 iPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 1 l+ I8 J4 E% q( \1 p: ^. c
MyBase.Load/ K% \0 _4 ~+ Z& r) C
RetainScrollPosition()
, y0 Z0 v* \2 H' b( u6 \5 ^0 |End Sub
+ O5 d& o5 u/ ?; R6 r2 }5 p5 e3 V5 _
3. DataList使用不同风格的模板
0 h% p# [) e @ w 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
* }6 {$ c! y/ R件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个4 ~- h7 Y. r0 w: n) a# T! g
元素或是加一个促销广告图等等。
, k, l! V2 P; N1 x1 T% jDim theme As String' T1 H- Z3 R7 A7 `* H0 _8 N1 e. `
theme = DropDownList1.SelectedValue
) g8 I$ n, r' i! e2 C7 t8 JDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool9 u& H) R4 ~" F* g# I, j
DataList1.DataSource = DS, i0 m0 l( n+ [# q( R3 v
DataList1.DataBind() * W! X$ T) c$ h+ I
4. 设置服务器端控件的焦点
; ^# X" W% r0 r! I! B+ CPrivate Sub SetFocus(ByVal controlToFocus As Control)
; j# M( @/ @% `9 M- z/ e, r# b9 {9 QDim scriptFunction As New StringBuilder# ~& j0 n: n+ I b7 l/ s6 h
Dim scriptClientId As String& d8 S& M9 {( b" E: w
scriptClientId = controlToFocus.ClientID
7 b5 e& Z9 A3 h4 g. EscriptFunction.Append("<script language='javascript'>")3 a6 s- Z0 J' |
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")' T( @3 C8 Y1 }+ O% X- c& i) Z
scriptFunction.Append("</script>")+ k2 s: U# v; g" L
RegisterStartupScript("focus", scriptFunction.ToString()). o4 D& g& N% @7 N1 W, E
End Sub
z! R4 r- v R6 z8 h. X% n4 [Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
7 D3 G- P& y8 }0 H/ iMyBase.Load
( h- R6 w& l- v0 c: WIf (Page.IsPostBack = False) Then u) e8 U$ a# E* S& F% ]3 A
SetFocus(TextBox1)
" |# D' q. q1 W. O) O3 O [' XEnd If
- r* a: G: R9 AEnd Sub
" \. s+ ?' z' q2 a% I 5. 滚动DataGrid
0 g' E$ v& q; k& b- h: q; z+ e 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
: ^& ` y% Y8 n有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控 `1 }+ G6 r, ^0 j6 f% r
件放在一个DIV中将overflow属性设置成auto7 @% y8 _, R! d
<div style=“height:400px;width:200px;overflow:auto”>3 E4 c7 E& @+ X2 N1 F
<asp:datagrid id=“MyGrid” runat=“server”/>
4 z+ m1 h+ i9 Z' x5 i1 O# C! i</div>
# w s1 o0 R8 u6 B# s 6. 动态创建控件( y- T! p$ G( ]* y/ x$ t
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。7 a2 `" j) [! |6 U' V
Sub Page_Load()& C. s$ s+ I0 |6 g& Q, P
Dim i as Integer2 r6 a; W" e! }4 d6 p. w
For i=0 to 4
! T) D) u! s: R1 a# O# d- p+ oDim myUserControl as Control. M2 v2 @; E3 ~
myUserControl = Page.LoadControl(“foo.ascx”)
h! p, [" F) L$ Q1 {+ u# kPlaceHolder1.Controls.Add(myUserControl)* g6 Y+ L1 f) F. X
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))( k- M5 H2 t8 [3 v$ m
Next i# J) K+ X, h- x
End Sub ; B5 k5 @( ~& n$ g/ d) ^, I
7. 客户端代码的使用, n8 a' ]% e& m" v
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标9 R7 \8 c; C0 N% t* {3 c
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性1 @$ r* ~# s# a; c8 y
asp:ImageButton id=“foo”
& _, l/ I: ~, ]7 g7 CImageUrl=“start.jpg”7 g+ p* g& r4 P2 m& ~" g
onMouseOver=“rollover(this);” : F3 ]& y* d* x6 f0 f
onMouseOut=“rollout(this)” h/ l4 G6 _0 P1 h) g7 m
rolloversrc=“myrollover.jpg”! H. U0 M: o* q" i. R: G
rolloutsrc=“myrollout.jpg”
& v" I, m4 S G9 D8 \$ e* Srunat=“server”/>
x* U; a2 V7 u, I* @: e% ~. U: u<input type=Button onClick=“return clientHandler()”
7 b% {# F/ A' ~; L+ KonServerClick=“Button1_Click” … />
+ ]) c4 D" s! F/ p0 g 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
$ J/ }+ A7 P# x' J: i有的客户端控件。& E6 H# S) z( L9 x c3 c
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 6 T- j4 e6 G0 v2 ?% @1 g
MyBase.Load
3 x, I/ z4 F2 Y3 H( P8 b. R RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
( m( d ^/ _# T! lEnd Sub 6 e9 d; _# S1 z- X( j
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|