TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
* y8 _$ S( C7 k求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
: o% J+ P- `) W. I+ C 1. ~ 的用法
5 F3 P" z7 F' [) Z! B 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
+ o& f) K; X" {0 \: ?2 Q式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不- a$ W3 ~4 `; C9 d
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
; ], @- r! T. h1 o ~/image/about.bmp ' Q# g x# }( Y; y, V4 e0 y5 h
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
9 \$ T y6 r" h& ]* g. M: C加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览8 }, V5 {# A8 |+ A: _5 Q
它。
. `8 e% d6 l. | 2. 在刷新和提交页面后,保存你的页面滚动条的位置! K: |& M% _7 w, A- {" i: ?1 R
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说8 M* Y0 L9 e* i7 v: a
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
K& r( Q* d1 E6 E* q0 U7 E; o组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方4 R1 B' `; V( R4 I
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370# b1 F* {) T$ z0 L' w. _. y c
个控件又需要他选择一下? 5 Y5 S) j8 f- |2 }5 w" K, Q- _" e
用下面的方法可以很快地确定和记住你提交前的位置。, f" T* ^5 u% @9 L% g, l' }
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element, V; d/ I2 c& @5 e6 _( r) V
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
0 `' a2 b3 w6 ]' ?3 X, SPrivate Sub RetainScrollPosition()% X( i1 q4 W% H3 l- O
Dim saveScrollPosition As New StringBuilder- N, X, N/ ^; e# e4 u# p' T
Dim setScrollPosition As New StringBuilder
2 m0 q" K7 T. L2 \' qRegisterHiddenField("__SCROLLPOS", "0")4 f% _1 B- L- }4 G# O
saveScrollPosition.Append("<script language='javascript'>")- h- u' i, L3 G: {5 x7 c
saveScrollPosition.Append("function saveScrollPosition() {")
: v9 K1 S& ?6 b$ H6 I; Z( o3 [2 W! EsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
9 ]/ u6 W/ i! B$ y. WsaveScrollPosition.Append("}")
6 p' V9 A' w! J" ^& b9 x, DsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;") M9 j3 Y+ H7 ^* |- m# d8 |
saveScrollPosition.Append("</script>")
' |# r* b6 I) l4 {' |( {1 BRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
! m$ w5 _! Y5 d3 HIf (Page.IsPostBack = True) Then5 N2 l/ |4 z7 [' I! D* b
setScrollPosition.Append("<script language='javascript'>")
) C: s8 V1 {, lsetScrollPosition.Append("function setScrollPosition() {")1 s% E& K# Y4 ~
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")3 q# z+ R: b# w/ k0 c
setScrollPosition.Append("}")% ?( k! ?$ D$ ~' ^" P
setScrollPosition.Append("document.body.onload=setScrollPosition;")
& Q7 c9 u8 Y7 \- X; c$ I0 j( t+ m; BsetScrollPosition.Append("</script>")9 N- _: h; q7 g- k6 ^3 ]. G
RegisterStartupScript("setScroll", setScrollPosition.ToString())5 L4 Z" o. |. \; G
End If
1 Z2 @9 E* @* I, G# Z t; ^8 J( cEnd Sub4 V* H1 K4 G) p0 W
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles . H/ g, R, U4 U$ n' e, X
MyBase.Load
2 u6 ?8 R( R# H5 b7 }8 m. hRetainScrollPosition()
; }; C- i7 A% @$ v5 ?- TEnd Sub
' h3 Y' X* q% e( C) S; x f
( A' b- a% ~$ [; `4 j. c( y" n* z& F$ c! H' Z3. DataList使用不同风格的模板
1 \: X, e4 G: `& f1 K1 s 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条* e$ a/ y7 S9 A
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
- C$ E& w9 }1 d. d {: X1 o* F8 l7 F元素或是加一个促销广告图等等。
* l; k6 S g7 ?1 N4 P: D1 C. yDim theme As String* z; [) Y. f/ g3 D1 s, T9 l% l/ ^1 a
theme = DropDownList1.SelectedValue
# U5 Z# ?4 S* a9 H9 tDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
+ Y, t+ h) {( F# FDataList1.DataSource = DS; T. @( V6 q0 I: q D
DataList1.DataBind() . }6 ?1 z! X% |( _$ w: l
4. 设置服务器端控件的焦点
8 A* r3 s0 N. }- G, d0 gPrivate Sub SetFocus(ByVal controlToFocus As Control)
+ H+ n1 K. r4 {! Y( v' ~+ iDim scriptFunction As New StringBuilder
0 H& w$ M1 D; ^. |# @/ HDim scriptClientId As String
& n% t t8 R. S1 iscriptClientId = controlToFocus.ClientID1 b% f3 D0 g h# r% |* I3 [
scriptFunction.Append("<script language='javascript'>")6 q+ N) h5 `2 W! ]" _1 x( ^; Z
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
& p) B- F$ C8 H" T) Z9 G$ gscriptFunction.Append("</script>"), k4 r! ~# \4 m9 x: ]- P. m3 [5 M
RegisterStartupScript("focus", scriptFunction.ToString())
8 h" G+ Y0 m* B1 @1 G7 E8 i1 L yEnd Sub8 `: ?* r; {- ^, @9 [. [" J
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 8 Z( V% k% d7 x" b8 m0 @
MyBase.Load# k0 O: E+ g+ ?
If (Page.IsPostBack = False) Then/ o- v9 | Z: s3 U3 f3 ?
SetFocus(TextBox1)
, |( K! U' _$ |; EEnd If
9 O$ e9 `) @" n) I. z5 fEnd Sub X& S% _" C+ I
5. 滚动DataGrid# B2 l+ K# |1 O
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只5 Z P7 g1 I6 F5 C) F9 s' i2 A
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
: Z$ a8 n% R2 T" g" y+ Z! y件放在一个DIV中将overflow属性设置成auto
$ C! C v$ n, F( [<div style=“height:400px;width:200px;overflow:auto”>/ i# S. m, F7 E/ O/ o
<asp:datagrid id=“MyGrid” runat=“server”/>
8 V& L7 k' z) f</div> 8 T( v% X ?* ~5 C* L+ p! a4 L! G; W
6. 动态创建控件 }6 J5 D7 q, s/ y
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
7 h6 ^: L" l; j/ ~& iSub Page_Load()
- Z; n! z0 b9 gDim i as Integer
' d0 C8 r' i9 C9 F a& ~) \2 aFor i=0 to 4 2 h) n5 I! U5 s7 W* I
Dim myUserControl as Control: K3 t) J+ |# h: t" b' l2 H0 F; w7 v
myUserControl = Page.LoadControl(“foo.ascx”)
1 X# Y& w; D; Z3 s6 tPlaceHolder1.Controls.Add(myUserControl)
. i' V e( r) v$ I/ t% O3 U/ aPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
( |% m v0 ~0 T. C' c3 X( q! w& UNext i
: w4 n" j3 ~' [% n9 rEnd Sub
/ h, }: f6 f0 U1 k. l7 @7 b 7. 客户端代码的使用$ R2 O/ ]) x" m1 t2 h% _# ?8 K2 j
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标: z7 q0 u% R6 Q6 ~2 k' Q
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性9 |" c4 \4 B% u& M: u2 ?
asp:ImageButton id=“foo” - M- r9 o" n' x6 Q! [
ImageUrl=“start.jpg”
8 A/ A3 S6 e( f9 I- U" q' x- DonMouseOver=“rollover(this);” # j% u7 x% }" S7 S8 }
onMouseOut=“rollout(this)”
: o/ I8 J& b+ Q7 _3 n7 \7 Yrolloversrc=“myrollover.jpg”1 Y9 i( ^% b) x' Q
rolloutsrc=“myrollout.jpg”* b2 A# Y* u$ r6 o! v$ B
runat=“server”/>( b/ E# ?8 q3 C2 v$ P; `
<input type=Button onClick=“return clientHandler()” 6 U* A+ L. j t
onServerClick=“Button1_Click” … /> * n0 ?; `2 _9 s. r. b
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所 F* t& Z+ O# V
有的客户端控件。
, j) l* M- M/ X1 j3 H& QPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
. N( L Y) G1 L" fMyBase.Load
$ _; m0 G [) U: x RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
7 B; ~9 a& V- A* HEnd Sub
+ K' q3 J# G8 R1 R( E% H8 J* V( ~ 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|