TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
5 p7 E. g! \: z$ @7 V求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。0 \) K' _3 n0 p# G) \; q" J
1. ~ 的用法
1 K$ w0 s) |7 m& K x" A5 B 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方9 E. Z- L9 p: H1 p' P" p7 {" s
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不" W! V4 y2 y5 K/ p! u
同层次的两个目录的aspx文件分别引用时,问题就会出现了。% X- f7 x' ]; @ m
~/image/about.bmp & V5 \; j W4 B
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更) F2 y% z5 H" N% e
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
: |9 ^: R; h2 Z1 w# H" C* c: x+ @它。( S/ R3 }+ T# @/ @; t1 m t! h
2. 在刷新和提交页面后,保存你的页面滚动条的位置9 ?/ k& q- |8 o( x5 T1 Y* q" T
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
$ d/ A p+ o) _8 T用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
2 v. ^# e' |( o( M组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方* U% X( O' N7 ~; j
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3705 A0 Z6 |! p' |6 M! o" p
个控件又需要他选择一下?
- B0 Q/ H! h2 K6 w6 u& _ 用下面的方法可以很快地确定和记住你提交前的位置。
( D! j' ^# V* |8 O 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
- B# t& t: \8 W/ p+ W不过他使用了Web Behavior这意味着你需要使用一个.htc文件
# f( z+ A6 n4 K9 m; QPrivate Sub RetainScrollPosition()
* P( x6 I4 l. H2 U4 jDim saveScrollPosition As New StringBuilder
1 L! C" _0 f* s; N2 ADim setScrollPosition As New StringBuilder
' s n$ i- ] H5 }. LRegisterHiddenField("__SCROLLPOS", "0")
/ s" n9 P- y! |, ]saveScrollPosition.Append("<script language='javascript'>")
; w' q' _* S; qsaveScrollPosition.Append("function saveScrollPosition() {")( u, T8 Q: Z0 S+ a" l
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")# y% g/ a3 }5 ?/ e, A; Q
saveScrollPosition.Append("}")
/ I. u( {2 V. @$ osaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
" z$ |, u" D+ ]2 D1 G$ W K6 o, HsaveScrollPosition.Append("</script>")
( u- @# B& Z1 F& e; C5 SRegisterStartupScript("saveScroll", saveScrollPosition.ToString())) M0 R+ f" ^7 i* S. {7 _
If (Page.IsPostBack = True) Then- B1 W0 p i5 K! s/ O6 U
setScrollPosition.Append("<script language='javascript'>")
/ w1 r4 b0 y- E" I9 [ `2 F# hsetScrollPosition.Append("function setScrollPosition() {"): M7 q9 O/ O5 R1 u+ N) U' R: }% f# W6 Y
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
0 }5 u; Z# u6 AsetScrollPosition.Append("}")
) Z% n8 q4 c/ vsetScrollPosition.Append("document.body.onload=setScrollPosition;")& J ^9 ^) V9 Z) L8 O7 K `; d
setScrollPosition.Append("</script>")
, r+ E- @, [( h2 ?RegisterStartupScript("setScroll", setScrollPosition.ToString())+ q: G: h) I; R. o& ^) z
End If8 T$ J) H% W& N. G- C* K
End Sub
7 u6 J9 d7 p1 z$ b) s3 p, dPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 4 ~- w- R7 T* k4 g1 l
MyBase.Load- P# s0 W$ Q/ J M2 i( o9 d
RetainScrollPosition()2 Y' ?# r, b4 |2 E8 }
End Sub
$ r+ ]& J5 A6 S0 ?6 N/ y5 u
. u" U" X; S5 L9 Y0 ?* o3. DataList使用不同风格的模板
r: h# S+ i5 l$ N/ v. w 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
+ S- i, [% V7 H! K/ G# F件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
+ f6 L+ {8 ^7 ?) i# b元素或是加一个促销广告图等等。
1 e8 ~" T0 G0 wDim theme As String( T% l; i0 T; Q% p" ^0 \4 D+ x
theme = DropDownList1.SelectedValue
6 q0 @& `, O7 CDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
4 ~; ]" h& o( n5 w& S% D: H% @& E5 _DataList1.DataSource = DS
& F* J3 ]" w ?7 V" T' _( }8 F4 ]DataList1.DataBind()
" L8 x1 \) @6 N. k3 P3 W3 t( j- G 4. 设置服务器端控件的焦点
: t0 v7 r3 A/ S {$ e" P1 VPrivate Sub SetFocus(ByVal controlToFocus As Control)) L4 ?! K) p0 ^& I! l: y: ` ]
Dim scriptFunction As New StringBuilder
- N' r" N; e* f0 k8 W' vDim scriptClientId As String
7 `- o' x8 h0 Y2 D- ^scriptClientId = controlToFocus.ClientID" x, k( X3 U& B) Q, n
scriptFunction.Append("<script language='javascript'>"). p6 D0 E" Q/ m ]& V
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")5 r; F- a; U2 H0 l$ q7 ?
scriptFunction.Append("</script>")
4 J) |( \. W# B ^( q6 C0 sRegisterStartupScript("focus", scriptFunction.ToString())
; L6 C0 ~9 [) Z C6 ]9 ^End Sub L3 D* ?( u3 G
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ) I+ Y. b; u% g5 q
MyBase.Load
4 R0 }. r+ O; Y. R6 @# n! }If (Page.IsPostBack = False) Then
) Y' H; l6 Z& ^. J& ^: ^- O4 VSetFocus(TextBox1)& B: y/ d7 t8 y$ p3 j
End If
% M$ p' i6 d" P4 W0 }& uEnd Sub % i5 j l/ }4 L3 R" [1 c
5. 滚动DataGrid
- g; Z$ a2 H- P% g. e 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只" }. u" Q/ V. t9 K
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
# p/ E, T4 B( k件放在一个DIV中将overflow属性设置成auto2 t+ D$ ~7 \ I. f
<div style=“height:400px;width:200px;overflow:auto”>; ^1 j. |7 W' w1 l9 s
<asp:datagrid id=“MyGrid” runat=“server”/>) Z l% G+ w* O% I! w+ e! p. s
</div> ' q6 |& h5 L2 a e. ]/ K" e
6. 动态创建控件2 H2 f" f j/ Z* i
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
/ N8 o3 }/ J- M _Sub Page_Load()
/ r5 Q, C: o2 x5 IDim i as Integer
0 s% r9 @0 W2 ]6 ~9 F( D0 BFor i=0 to 4
- E( Q- z2 D! q) X$ ^0 W1 q$ HDim myUserControl as Control
* _6 W* V2 ?% ~7 @8 O5 umyUserControl = Page.LoadControl(“foo.ascx”)
% D9 l: g2 z8 ]9 W# ^, OPlaceHolder1.Controls.Add(myUserControl)
/ N: K4 S6 I0 qPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
5 _& A" W: N& C' }" N% U( A: UNext i
& Y2 Q. G, M* l. R/ Y$ vEnd Sub 8 R* }& a% x) }0 v! L$ \
7. 客户端代码的使用
. _7 V* i) `7 S% f2 n1 m$ z7 T* W 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标2 W& W8 Y' }2 W' ?/ i7 w" O$ I
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
+ K- I8 N0 w9 o) E9 Z( q0 pasp:ImageButton id=“foo”
( ?2 f* C# x/ B6 M9 G9 BImageUrl=“start.jpg”
7 Y i0 P8 H1 @onMouseOver=“rollover(this);”
( a2 c' E: C" S0 B" p& F* x. z TonMouseOut=“rollout(this)”& E3 |( T; Y: y9 \
rolloversrc=“myrollover.jpg”; p: q; l$ X- W, x; l
rolloutsrc=“myrollout.jpg”: A# g) e' ^; f' r! V' I
runat=“server”/>
% ~0 m& `) X) o3 ]4 ]<input type=Button onClick=“return clientHandler()”
( e- H {; O4 R2 |9 k4 a" conServerClick=“Button1_Click” … />
3 i; I5 J. L* H5 M( L. V 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
0 t. p! b- F- ^9 U) N1 A有的客户端控件。+ k, O+ h( U( ~
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
0 a0 |# R2 y9 O# E+ s, p V7 ^MyBase.Load+ K4 q C% Y2 n, u: M, [& U
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")7 v3 y5 h7 v6 g: |; V- _' f+ _
End Sub
: e3 u- N& F# F2 X& s3 E" N 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|