TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
) I9 M& p/ s) w6 n! f6 S0 q. Y8 |) I求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
; l C6 |% @' u( D1 x! ~4 H! d2 G& y% { 1. ~ 的用法1 T4 A8 F t; e: s- f4 I
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
8 ^; O% q: q( L# b式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
, N# z( F! d6 q& Z$ Q& L同层次的两个目录的aspx文件分别引用时,问题就会出现了。" T% o- O M; C' i
~/image/about.bmp 2 g% R f8 _+ Z. W- N: Z2 a
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
: @' J- e/ s; T" N# W加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
6 i- @ f- G7 \# Y. b9 ?它。5 l6 C" \( r. |, t6 ]& M
2. 在刷新和提交页面后,保存你的页面滚动条的位置
0 z( N- m3 Q( |% b 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说! ]( ~7 w! T3 S, r8 @
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸) W6 B+ e3 D4 ^. V) M3 g
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
9 u' w, d, t5 ~" E* C也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
6 s7 n+ W4 B0 n- N+ o! K6 {% ^5 n+ r个控件又需要他选择一下?
# Y' D9 M0 n! K+ ~' M" E- O 用下面的方法可以很快地确定和记住你提交前的位置。! T4 x3 J4 w0 S {5 `
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
( z0 p. W) `7 |不过他使用了Web Behavior这意味着你需要使用一个.htc文件
$ u9 F4 ]/ Z" Z0 K$ O5 _, XPrivate Sub RetainScrollPosition()
* J* @6 y0 f0 q+ {7 YDim saveScrollPosition As New StringBuilder; f; N' i- x$ Z$ ^* _
Dim setScrollPosition As New StringBuilder) m0 [4 h1 R5 N( q; E- L/ K
RegisterHiddenField("__SCROLLPOS", "0")8 C& C, r* @ p' i! i
saveScrollPosition.Append("<script language='javascript'>")7 ]' h% S- o0 G( d' N% z' {
saveScrollPosition.Append("function saveScrollPosition() {")" E5 w- J! r' [* B& M
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")/ b3 q: S0 I3 A2 g
saveScrollPosition.Append("}"); Q$ S* q1 j3 P- f2 f. A& S
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;"): B1 u) C4 x- Z
saveScrollPosition.Append("</script>")) S- |- n5 n( A4 j8 N) o
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())6 D% ?1 V' z: M* z
If (Page.IsPostBack = True) Then0 y& Z6 b9 d* `0 i) A
setScrollPosition.Append("<script language='javascript'>")5 M" n- B% d; g; ?, a% n" j `$ u
setScrollPosition.Append("function setScrollPosition() {")6 M# K) R% j& a# \- W
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
" F3 H# l9 G5 s4 EsetScrollPosition.Append("}")5 S- y: p; P1 b7 e* x U% \
setScrollPosition.Append("document.body.onload=setScrollPosition;")
8 |3 B4 r* k# HsetScrollPosition.Append("</script>")3 ?- f" m! Q) W. f7 {& x
RegisterStartupScript("setScroll", setScrollPosition.ToString())
! m2 n: ?/ A- w8 }End If
) Y; T- R7 |; s( X. c. hEnd Sub8 T& Z0 K. x: ^. r
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
5 T0 S4 w8 e& k0 c" B: iMyBase.Load+ e$ W. b4 H, S2 t% M: v
RetainScrollPosition()
$ {( O, E, b0 TEnd Sub
8 K1 z' g+ f! Z' p, A. ?# A) M. z4 `) a
3. DataList使用不同风格的模板& j7 x5 e3 Q- y1 U
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
/ S, [0 S1 c2 V3 M件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个5 D+ v% j& N2 H# w. m- @
元素或是加一个促销广告图等等。; x; k/ R! x* u E. k4 S, q
Dim theme As String
" m& {% F1 t1 M9 Y6 Gtheme = DropDownList1.SelectedValue) a6 T) G5 ] t! U0 D; c
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
5 o9 y+ M, U: l6 a. U2 aDataList1.DataSource = DS/ ?3 f _4 ?+ i% k7 S8 O& w6 L
DataList1.DataBind() & X& B: K1 L( v% Y$ @* k
4. 设置服务器端控件的焦点
: R4 A7 c" n3 a9 n7 t" j# {# UPrivate Sub SetFocus(ByVal controlToFocus As Control)
" }) i0 z6 e* z5 F, t2 v% f' tDim scriptFunction As New StringBuilder- M1 D' O @' R, }- C
Dim scriptClientId As String
) p- n( D% t9 F, l$ t9 p, h+ n# s" JscriptClientId = controlToFocus.ClientID; I) Q& ]: t1 \3 ~
scriptFunction.Append("<script language='javascript'>")& }' I& o% _% v0 M" q: H2 ^$ d! B3 ^
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
/ f ?. I% j) O; }: G# OscriptFunction.Append("</script>")
3 Z) D( t. I3 ?2 Y$ ]& p `RegisterStartupScript("focus", scriptFunction.ToString())7 O' D' n' `/ K1 L2 H. [8 A9 S4 z
End Sub3 x% C( d/ `3 z. a+ I
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
) o/ K* l! k& f2 \" TMyBase.Load
, R2 @* J) Z! I) U. ~7 B1 RIf (Page.IsPostBack = False) Then2 {. c/ g/ [, e# [5 \/ Y
SetFocus(TextBox1)
$ E" ~5 Q9 \# w& d6 A; ~End If6 P5 A5 A* i7 T( z5 ]) o
End Sub
; T; d1 z$ w1 H/ S! |" A; u' l* | 5. 滚动DataGrid' l3 e8 e1 t, F4 U3 Y# J& X3 v, W) X
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只4 G& _( ~4 d7 r
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
& _' n: X9 ]! T, M. i, J2 e件放在一个DIV中将overflow属性设置成auto! l8 C( _% a* N0 B
<div style=“height:400px;width:200px;overflow:auto”>- q! w6 w" g8 r2 L0 o: o& Z5 c, `0 f
<asp:datagrid id=“MyGrid” runat=“server”/>, q) f# j/ G* q' |' u- t* z. z. J$ v
</div> - u' {2 D4 W2 E6 G$ Q. E: X
6. 动态创建控件( ^+ l* [2 f4 J
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
9 x- L) w$ @6 v8 G! G" P& Z6 A% NSub Page_Load()
+ ?6 J+ [! B2 J& q! tDim i as Integer e, L( f, [' I0 Y' W$ Z# X
For i=0 to 4 # f. z, f7 [+ x6 F2 b8 [1 l
Dim myUserControl as Control
& p' c$ l% m, \+ W- smyUserControl = Page.LoadControl(“foo.ascx”)
) a9 ~% U4 S( j, a& ]$ `* I6 O4 Z( `5 iPlaceHolder1.Controls.Add(myUserControl)- ?9 q# \$ v" ^5 }
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
1 \' @/ _+ Q$ x1 gNext i
: h/ @6 I+ s- z& d. uEnd Sub / K3 n( U4 ~' d
7. 客户端代码的使用
3 l4 v8 t+ ?; c 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
0 d) m/ k. `4 B) B2 d准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
* P$ u4 u/ F% k+ b5 O9 `2 @7 I& Nasp:ImageButton id=“foo”
7 E4 y& D& a) M& g, r' r7 n5 AImageUrl=“start.jpg”
% [5 p# K1 O$ @. |" F9 r, OonMouseOver=“rollover(this);”
# V" Z. k9 |" {onMouseOut=“rollout(this)”
$ r; ~ X, _. V" o1 _0 E' g# _rolloversrc=“myrollover.jpg”
9 q H! ?. h; c' xrolloutsrc=“myrollout.jpg”
9 l# `/ P0 z* v; m( N5 b% irunat=“server”/>
$ O8 Q; X9 k6 j& I1 v<input type=Button onClick=“return clientHandler()” 8 k1 \4 V7 G9 R3 L" Y
onServerClick=“Button1_Click” … /> + i+ ]+ J; G4 C+ a# u. I. M
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所5 Y' E7 ?$ M' Q" }/ q* z
有的客户端控件。
2 Q: I0 V3 o% q9 C+ V# p, v+ HPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
$ P/ c+ ^7 y; L; YMyBase.Load
& n7 R7 X. C2 }9 c$ \; ~ RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")- J, W* P; V' i3 c# H' L
End Sub
; t2 B0 y: l/ k6 d5 E: [& d4 x; Y 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|