TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需* y! u' B! X l* `
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。0 k7 t8 }7 \! H# c5 w3 _. j
1. ~ 的用法2 c. r: H1 H2 {# Z+ K. {* H+ K
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
& i6 U9 }; E- Z- {3 S) u* ]; H7 ?式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不* T, E. P; W9 ^' t! y/ _% w7 S
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
0 L" @. O7 l# d! z( w, Y! M ~/image/about.bmp
' ]6 e: p' t ^0 c( X' ?是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
' u7 ]5 h& y0 q& G加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
, S4 n+ y) u5 f0 J# N$ n" [它。
3 {; n- ]6 B1 P0 L* P" T: |5 P; F1 U 2. 在刷新和提交页面后,保存你的页面滚动条的位置. Q, W# @5 {! H1 W6 C
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说. B3 ~" c. s. i8 ~3 f5 e
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸$ K: g2 }1 l; o" W! G
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
+ k8 C% r3 c5 q( N1 Z; j也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3700 j5 W3 N) @7 g2 ^. P- Z! |
个控件又需要他选择一下? . y! m+ Z) `$ ^. i: \; ^. M$ s
用下面的方法可以很快地确定和记住你提交前的位置。
5 T5 I$ M# o _: v% ?6 i; p* J 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,+ X+ v/ K& ?- b3 u9 Y4 _; @
不过他使用了Web Behavior这意味着你需要使用一个.htc文件8 Z3 {7 `2 P0 h5 _
Private Sub RetainScrollPosition()
6 `0 Q' ~6 y8 k6 o8 J3 M% @/ ~Dim saveScrollPosition As New StringBuilder, v! H! G/ P: P: C2 f. i& e
Dim setScrollPosition As New StringBuilder# b, w( P: T. |9 F% X
RegisterHiddenField("__SCROLLPOS", "0")! h: i, @+ p. g. W1 @1 z& [" h
saveScrollPosition.Append("<script language='javascript'>")
2 j6 K; J \% v8 a9 h1 QsaveScrollPosition.Append("function saveScrollPosition() {")
6 ?9 D. l8 i! {; ZsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;"); I6 G! V" @, e( J: J
saveScrollPosition.Append("}"): z+ B9 i' n( D$ O8 O0 H) h
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
7 f2 e! K+ K5 C2 \) m5 a2 UsaveScrollPosition.Append("</script>")
" n+ x' M, l1 J, P" |) h, WRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
9 L6 i9 O! i+ B% _If (Page.IsPostBack = True) Then, \! f& \( `- ]; \! x! g+ ?
setScrollPosition.Append("<script language='javascript'>")
9 Y5 O2 W+ d3 m; [! n8 GsetScrollPosition.Append("function setScrollPosition() {")
8 |, h/ }4 Y( f+ E, {. X3 OsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
3 k( C' k" @0 I; g. I+ Z* hsetScrollPosition.Append("}")) w. J% O: E/ Y# S4 y) o2 _
setScrollPosition.Append("document.body.onload=setScrollPosition;")4 |# C) d. ]$ t& [# q2 Y2 N4 U
setScrollPosition.Append("</script>")/ O! ?9 F1 o1 n' C. y
RegisterStartupScript("setScroll", setScrollPosition.ToString())
! e r1 M( @4 M) ?* g& i' EEnd If4 g- G) ^6 [3 g% L
End Sub
3 i9 @" c2 [+ w; @& `Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles - ?. b8 F5 c, d& G! P
MyBase.Load. [) Q$ F5 q) r+ a/ z
RetainScrollPosition()+ F G) ^# h6 o, Q
End Sub
# X1 \% _6 n) B1 @2 Y1 {( E- h, p/ |$ _
3. DataList使用不同风格的模板
. e1 Z0 n9 D, `6 E, {, B 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条8 s, i: H$ K# e3 q
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
4 C. p$ j; h8 y' Y$ w元素或是加一个促销广告图等等。
3 ^$ q- U0 j( bDim theme As String9 c" @& K6 R4 G
theme = DropDownList1.SelectedValue
) g3 H: D9 k7 z& A, GDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool9 j7 o0 \. w5 p3 K! ` ?3 S
DataList1.DataSource = DS
' Q) w& P6 b! F. ?9 j" VDataList1.DataBind() " s% }0 E" h/ d) x
4. 设置服务器端控件的焦点0 c6 l1 N9 q i) Z' O
Private Sub SetFocus(ByVal controlToFocus As Control). C- ^+ h+ S, k; a6 R# B
Dim scriptFunction As New StringBuilder3 ~0 m3 y$ r0 s0 |2 p, y
Dim scriptClientId As String
" Q: L. ^9 y M$ A8 m4 kscriptClientId = controlToFocus.ClientID# v- Q# P) z6 ^" S m- x. G8 D
scriptFunction.Append("<script language='javascript'>")
$ S7 L2 g# u9 |' S' L9 f7 W+ |( VscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
0 m: @! \/ P; ^8 [scriptFunction.Append("</script>")
5 o% X+ M8 {; Y, f9 @* }RegisterStartupScript("focus", scriptFunction.ToString())# n- \' Q _. T" m4 I
End Sub! A+ I! \8 R9 Q7 c
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
" W, A7 D" V7 b& V, U* U) _7 x3 k+ TMyBase.Load+ a: p9 S% m9 v5 _5 w; A1 {
If (Page.IsPostBack = False) Then
/ W! i9 \# N- x, zSetFocus(TextBox1)
# b2 P7 f, E5 j! C, zEnd If+ y$ N% Z; P7 S0 E& p8 y) K+ C
End Sub 0 ? g: y% ?' }4 y& y* l
5. 滚动DataGrid, y4 A& W" g4 [
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只" d8 K0 y0 o" n r# {( }
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
1 q' B4 q; d+ q0 ?件放在一个DIV中将overflow属性设置成auto; c! r3 c+ y# W
<div style=“height:400px;width:200px;overflow:auto”>
0 p6 e! W$ `6 z<asp:datagrid id=“MyGrid” runat=“server”/>
6 J" L% _* o6 t2 L</div> 5 n9 U( ^( C" n: b# n
6. 动态创建控件) z& |6 X* X% Y$ L+ h
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。* Y/ N; G1 D! b, J
Sub Page_Load() _- U* J3 M3 k- s1 o
Dim i as Integer
/ o5 T3 {6 U3 N$ ~+ mFor i=0 to 4
/ Y+ ^9 v: p D; `Dim myUserControl as Control
. P4 t6 I9 i4 S6 SmyUserControl = Page.LoadControl(“foo.ascx”)
1 D! V: R5 \, _6 TPlaceHolder1.Controls.Add(myUserControl)+ }# g6 c( N( P+ j6 M
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))6 b3 C+ L( W* R2 @, y& [& D
Next i: n$ `; n1 i) a, t7 z
End Sub 7 c8 i: U+ q9 q
7. 客户端代码的使用
0 j2 [9 p8 {5 g) \/ a5 i+ e+ S3 t3 N 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标, K8 m# P8 j$ u. b- C
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
' E, X7 l. ^! Y- W) l2 \$ V9 ~6 jasp:ImageButton id=“foo”
; F5 |# E' S+ Y2 }# l: F3 _2 YImageUrl=“start.jpg”; p: i% }* z- C7 Z2 @' r) G
onMouseOver=“rollover(this);”
% @5 }* I+ i7 Q: ConMouseOut=“rollout(this)”7 P& K. e. W5 y* V |8 y
rolloversrc=“myrollover.jpg”
1 L3 s+ N: n# ?! [% wrolloutsrc=“myrollout.jpg”
7 Q' }8 k) M1 x+ V" A; Erunat=“server”/>
$ a( `% N$ |6 u2 C% [1 j: S& P% K<input type=Button onClick=“return clientHandler()” 2 H. N# T+ `% [+ U$ j) ~$ _3 ~/ \
onServerClick=“Button1_Click” … /> l# P/ d$ _8 b3 P# O) g
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所3 C. m) j3 V5 W- y# _7 N
有的客户端控件。
: A( b; S/ c+ n& yPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles , S3 K5 K8 g5 a
MyBase.Load Z+ t3 w6 A. M3 e$ U/ I
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
; Y9 s8 P5 \% ?+ U4 @0 F! o- \End Sub + V0 X+ I) n1 Q3 y Z" @' c
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|