TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
. \$ W3 N# f* Q求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
9 U* d' [- L( \7 G6 y 1. ~ 的用法
) L+ U/ x3 U4 c 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
8 Y$ ^9 B( Q* j. W- @: z$ C+ e式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
" `! ^& \* A* `) ^! B/ x2 g同层次的两个目录的aspx文件分别引用时,问题就会出现了。
% {4 s1 Z2 w# ?: {; s ~/image/about.bmp : w% c5 E" v5 _5 A% G
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更* c' T; g# a U) \! D/ K
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
& _" ?! D* R8 _# d它。( R7 R- F" s) m q! Y. N
2. 在刷新和提交页面后,保存你的页面滚动条的位置 `- N! N2 W& i7 o- C% F
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
5 Q4 B0 j, b$ O" x+ ]( H2 T用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸/ L9 E- q; l- y: G! o( S
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方! ^% m; y7 F; m& \
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370$ x! J7 D: ?( Q2 O6 g% ^2 E
个控件又需要他选择一下?
% ]) T, ]% c2 ]! C+ `7 E 用下面的方法可以很快地确定和记住你提交前的位置。) i0 b, g$ O9 S! j. b- B
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
9 p8 V* B/ S9 j; ^) {$ ^; N不过他使用了Web Behavior这意味着你需要使用一个.htc文件0 t. I: s3 D4 h5 k$ [) M. Z
Private Sub RetainScrollPosition()
% F4 R. _0 V# vDim saveScrollPosition As New StringBuilder
5 X. I/ v& Q) k7 Q% x% ]Dim setScrollPosition As New StringBuilder
. _% p3 [3 c1 LRegisterHiddenField("__SCROLLPOS", "0") C) o! k8 z ]0 o) B% w: K
saveScrollPosition.Append("<script language='javascript'>"): a7 l8 ^/ T% ~5 N- L
saveScrollPosition.Append("function saveScrollPosition() {")" [! ~ g$ k# X8 G
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")& g& D9 J0 W0 s: U$ g$ W- P, }4 W
saveScrollPosition.Append("}")
( _* y% A) G) U! B- S+ gsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")' y' V4 D" X$ ]' p* C/ S
saveScrollPosition.Append("</script>"); W1 V. J+ I5 T
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
$ ?& \9 C/ Z0 u) u- D5 G: C) YIf (Page.IsPostBack = True) Then0 G1 Y* {& } s& }4 w* u
setScrollPosition.Append("<script language='javascript'>")7 p* }3 o3 o; R9 T
setScrollPosition.Append("function setScrollPosition() {")
9 e) J" h3 K& a. a0 nsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";"). @( u, V1 i/ d3 E! H& h: s& w
setScrollPosition.Append("}")& V& D# G2 U0 c( D: f1 r1 [
setScrollPosition.Append("document.body.onload=setScrollPosition;")
! G+ n# v! w3 V& NsetScrollPosition.Append("</script>")
' j# f; y4 o6 O5 s$ ^% ]RegisterStartupScript("setScroll", setScrollPosition.ToString())3 f1 ]. b; E k! ]8 |
End If( N6 A* s ~% _6 C
End Sub. @6 v" g9 n; v+ J# r4 B8 l1 l; f
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
: u" A' e0 o. A2 c( u7 KMyBase.Load. Z4 _. Q& `- U* t! P$ O( y
RetainScrollPosition()/ x _* h; V2 P" f
End Sub
) R5 e' f( D ]! P& B8 b! O( X7 S8 ^ I
3. DataList使用不同风格的模板
0 W8 A& J( K8 b' i 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
3 R' ~& E; D# I( X) Y件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个# W! z9 N5 \& n8 Y
元素或是加一个促销广告图等等。$ j& t, u" w, C8 F2 X
Dim theme As String
7 U: a" i- s6 N$ ftheme = DropDownList1.SelectedValue
3 L. h' e& n$ R4 J3 DDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
" t X% p# w/ t0 @) h! m* N: q- DDataList1.DataSource = DS
8 q/ z0 S, m8 }: A8 I' @DataList1.DataBind()
* t% P& r7 a1 `, | 4. 设置服务器端控件的焦点+ J' N% u9 R0 f! s/ v5 @
Private Sub SetFocus(ByVal controlToFocus As Control)
8 Z1 D. h; Z7 x/ z4 I) @& ^# d {Dim scriptFunction As New StringBuilder
, y+ e3 u. w7 H, Y; F# Z, Y2 I/ EDim scriptClientId As String
4 C, `7 f7 l9 b3 I: g3 C* M7 y6 HscriptClientId = controlToFocus.ClientID
5 m1 D/ m' `0 v9 M% G; vscriptFunction.Append("<script language='javascript'>")
0 B1 w D, c' Y9 cscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")% c: u; \1 P& r8 E
scriptFunction.Append("</script>")
3 K5 |: O4 h7 Z6 W1 d/ ^RegisterStartupScript("focus", scriptFunction.ToString())
E0 u& t; b$ u6 o: |( \End Sub
- \4 a$ e- m/ C3 ePrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles , a3 K* ] N }. w. a
MyBase.Load
. ]( j/ b' Q+ LIf (Page.IsPostBack = False) Then
4 r4 m) X& ]$ O% D+ @+ SSetFocus(TextBox1)8 b' n' F# K# Z* ]" L, k( t9 k
End If
4 ^3 F3 [/ K1 S4 {End Sub
9 u; I2 q& N7 ` 5. 滚动DataGrid
/ ~; U3 S1 g; o/ x& @, e6 E% g& g 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只7 ]" Y3 ]' D* p9 x- u7 p8 u
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控* Y Z, E" o7 c. r5 w4 N
件放在一个DIV中将overflow属性设置成auto. b: Q- A/ T% w; ?9 C( }
<div style=“height:400px;width:200px;overflow:auto”>7 t! B3 ~+ r/ t9 _3 L
<asp:datagrid id=“MyGrid” runat=“server”/>( N& T ^3 t$ Y G% z
</div>
3 _ Q' R: [* }! r 6. 动态创建控件. b# `+ `. P7 c% w
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。; ~1 c3 ?) z6 r+ d- e$ N& E
Sub Page_Load()8 o9 j, i- e2 O! z; m. c
Dim i as Integer/ `& ?+ B: W8 w9 C
For i=0 to 4 8 X) A; Q* I% z# S0 {- L' T ~
Dim myUserControl as Control9 x1 P" H# H+ i
myUserControl = Page.LoadControl(“foo.ascx”)
' U3 t2 K' [, [PlaceHolder1.Controls.Add(myUserControl) S8 b- F4 h* _, g0 L/ L/ H2 F% u
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
+ I1 C* N0 G; l2 z$ p9 |, L" _Next i
2 E+ v8 M* j' L7 ~3 ]. g+ I6 FEnd Sub
j: \4 t9 w: ?2 r/ p* P. @ 7. 客户端代码的使用
$ O# d8 O. `1 U* j) s. X 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标# b. {* q2 Y2 y F+ M
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性9 F6 k; m. _4 I; \4 O: c
asp:ImageButton id=“foo”
5 o# P, s' @; U8 X U2 qImageUrl=“start.jpg”
' a: t1 e6 W+ T$ p* gonMouseOver=“rollover(this);”
" M& q4 L3 x- L# donMouseOut=“rollout(this)”4 L; y0 X9 I& O2 m# m( b
rolloversrc=“myrollover.jpg”
. H7 p6 d* @! r/ V. Xrolloutsrc=“myrollout.jpg”
6 ]( ^& [! p" C5 l, Urunat=“server”/>
3 h( ^# J: L5 B9 H0 l7 u6 \) C* f<input type=Button onClick=“return clientHandler()”
" e3 g/ e% x! h+ yonServerClick=“Button1_Click” … /> 1 ]1 r W/ ]5 x) N x* N
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所" ^. ]4 N/ e6 n( d* ?
有的客户端控件。4 z# ^% C' K9 T1 t7 ~1 B1 @
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
1 _9 f( ^) E1 zMyBase.Load
5 ?' y+ h3 w( B" n3 U RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
; e& o f4 x8 j6 `( KEnd Sub
8 Q" h! }% c2 @; z8 ]: ` 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|