TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需8 x; f3 S9 F. G* g4 `" v3 e
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。) E( M7 R" q/ d2 V
1. ~ 的用法
; z) }% N- t% }- r 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方' ?& q4 s/ {! L3 S: f( e' e9 r5 w
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不. ^8 a$ @. }) \% z' @$ g" E& g
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
- d! L1 A- U, z3 L' E& q ~/image/about.bmp 2 m4 a3 v- f1 V; V6 @1 J" x
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
% G% G% M; k* s. K* P: y; n* M加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览% o' Z! w! c' m) v( w e4 Z
它。
' x. K6 E! Q( B1 X" L. k0 c2 o 2. 在刷新和提交页面后,保存你的页面滚动条的位置
# B- l1 U) z* N8 k$ y$ Z 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说) K m! q* d$ F( i9 o q3 d
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
6 z, K0 U8 M5 a$ q& y3 J" P$ V组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
2 O5 K9 C1 j# M- H+ h; v也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
% h. `* p! T& V" H个控件又需要他选择一下? ) b. [% `7 W9 l( P0 l
用下面的方法可以很快地确定和记住你提交前的位置。
1 s- {/ l E7 l7 o. D2 q# J 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,$ o7 i# s: e L
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
9 y3 l1 G0 e0 q; N) hPrivate Sub RetainScrollPosition()7 @9 d9 `# `0 G; t' ? c! \1 E
Dim saveScrollPosition As New StringBuilder
; z( }# |1 T0 W( `4 CDim setScrollPosition As New StringBuilder, n/ k: T5 P$ g( A
RegisterHiddenField("__SCROLLPOS", "0")
! W# F/ Z! V* ~! a" t6 \; BsaveScrollPosition.Append("<script language='javascript'>")
; i1 W% z: G; {) TsaveScrollPosition.Append("function saveScrollPosition() {")
+ U$ v) g U" V" B. c: r5 F) |saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")# C9 F: ?+ N9 ~+ B5 N, `" S L
saveScrollPosition.Append("}")
) a5 v7 b$ T7 [$ `4 b, isaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")2 U4 q/ _, Y' Q/ ], v
saveScrollPosition.Append("</script>")
0 \7 _2 ^. N8 x4 CRegisterStartupScript("saveScroll", saveScrollPosition.ToString())- ?# U( V/ H6 @
If (Page.IsPostBack = True) Then$ a( x W, O5 V. K L# S6 [- {0 r
setScrollPosition.Append("<script language='javascript'>"): V6 y+ E) h0 L6 F& | m
setScrollPosition.Append("function setScrollPosition() {")2 f& r6 N. t9 c. B- Z y# n
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")% U& Q1 H$ V$ i1 _3 ]# i" t
setScrollPosition.Append("}")1 q) [; A1 C. g) i3 i* u
setScrollPosition.Append("document.body.onload=setScrollPosition;"); |) Z0 U' K0 |5 y" C1 e5 R6 P
setScrollPosition.Append("</script>")# Z1 F' g, Y9 j& M0 U! }
RegisterStartupScript("setScroll", setScrollPosition.ToString())
0 L) W- H, g/ y* a& D% xEnd If2 V/ G& g0 {- t! k+ D- {
End Sub2 h( d8 U# g" ]+ _4 _
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
6 w! l+ F. H6 n6 hMyBase.Load0 ]+ V9 s6 r0 K2 V* f
RetainScrollPosition()
' r' t8 ?9 s! |' y( {& FEnd Sub 9 N4 X- u Z3 a; Y/ L4 y5 o, q. t
2 r( O8 x/ A2 G( f" O" ~3. DataList使用不同风格的模板) ^% d* U2 X- ` h2 F
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条. t: N+ }5 B, W9 O) y7 }, U6 V
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
, y) c- p4 k2 x$ p元素或是加一个促销广告图等等。5 I( g' C( N% V4 {0 n w- d( x; Q
Dim theme As String& A ~1 J" |8 s0 S% P' h2 l8 g( h
theme = DropDownList1.SelectedValue
$ L: d/ l$ k: Z3 J8 ]& fDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
& d K" A; r3 r5 D' cDataList1.DataSource = DS/ O& p) t( Z/ Z' I. ], |
DataList1.DataBind() 7 `6 r* Z0 E3 N7 I+ y. ]( u
4. 设置服务器端控件的焦点
9 O6 i# p3 G0 H/ U; y+ ^% |Private Sub SetFocus(ByVal controlToFocus As Control)
% |! Q1 N1 ^% Z5 T5 G4 o% [Dim scriptFunction As New StringBuilder
2 y, g, M$ Y& K' `% eDim scriptClientId As String# k! o, |" q( ^" \8 j
scriptClientId = controlToFocus.ClientID- \0 |: P( Q: D& W# A( ~& C, O
scriptFunction.Append("<script language='javascript'>")
3 i) A% o: u; J% yscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")+ ]! c% ?; `/ g0 R o9 k3 y
scriptFunction.Append("</script>")
+ d# T) m8 \# w$ IRegisterStartupScript("focus", scriptFunction.ToString())
5 \( F1 Q& Q, QEnd Sub
. U& g) r6 g) S) `5 }' ^5 u! uPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
$ r) Q/ }" A' e) u4 w8 |( h0 rMyBase.Load
8 w4 u: H: E9 g. s; NIf (Page.IsPostBack = False) Then+ [- h- }* J5 W+ x% E' ?
SetFocus(TextBox1)# @2 }) X" i, j
End If
& |) ~. J/ I E: S4 ZEnd Sub * ` K A" C- ]7 V9 k
5. 滚动DataGrid
) g; \( Z/ ^. z 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
; Y; {2 l ^, J( Y6 `3 r+ l/ M$ h有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控2 N" O: J7 r0 R( ?
件放在一个DIV中将overflow属性设置成auto# k4 ]9 l% a- o
<div style=“height:400px;width:200px;overflow:auto”>
& v* @# K$ O2 W& y+ g) ~* H( ^<asp:datagrid id=“MyGrid” runat=“server”/>
) N9 X% { M6 U- q- H, S</div> & Q E$ y9 U% U# `, I2 @
6. 动态创建控件1 u# \: C7 X* Y# Y
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。9 e( `5 i+ N" D) t
Sub Page_Load()$ v; O$ I0 ^* e+ d# s5 Y/ I3 q) u
Dim i as Integer2 |4 ~/ I/ x$ Z8 J2 R
For i=0 to 4 8 G. O9 \0 }2 M: {; E+ C' }2 r
Dim myUserControl as Control& A9 T- k: [1 M
myUserControl = Page.LoadControl(“foo.ascx”)
& J$ Z0 K9 V* l( OPlaceHolder1.Controls.Add(myUserControl)5 P7 k; Y+ ~8 L( S' m0 U
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))5 j& m0 U6 s/ `- d7 Q- ?
Next i+ l& B$ w6 ?" d) v/ d5 N
End Sub
: }7 h z& {' T; \! b$ k1 M0 M 7. 客户端代码的使用' n3 W, l) T# v. l; B1 o+ T1 ?
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
( q* `, E1 O* j0 P" {准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性# p9 _( ^2 H6 ^5 n( B* |1 }
asp:ImageButton id=“foo” 2 r7 |) y! ]9 M& i0 M3 W
ImageUrl=“start.jpg”% q5 r1 ?' @3 ?% F, M1 E
onMouseOver=“rollover(this);” 7 [! `( P9 f8 {# ?
onMouseOut=“rollout(this)”: Z' v# @* {) p7 A$ {
rolloversrc=“myrollover.jpg”
. M+ Z1 T, z$ q7 @; y9 ^/ krolloutsrc=“myrollout.jpg”
2 v) N' g# c- H( c; ?* ], Hrunat=“server”/>/ r* c8 G7 O' j& {+ y* }( R
<input type=Button onClick=“return clientHandler()”
& B/ B2 c0 c u1 I- x# J `onServerClick=“Button1_Click” … />
2 j x2 N9 `! ^) X$ U a/ G 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
3 `) ]' g% N' z, d* P有的客户端控件。
, M# x( u; x {; DPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
2 w: R d2 N& R4 c6 Z( p! {$ O( sMyBase.Load" [ |2 `1 U( F& d6 H8 O9 A' v
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
9 h- [& t9 B; m5 _( lEnd Sub - O2 L4 B! s5 q: B0 D
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|