TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
G( E( k$ a- p' f" l- [求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
4 h4 C* _4 i) e' L, C/ i/ ~4 s 1. ~ 的用法2 g) W$ |% M* ?5 Y2 r$ u
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方9 C# f$ J, J# T% F% S- m N
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
# ~! A' Q: j! }8 p2 {同层次的两个目录的aspx文件分别引用时,问题就会出现了。! |1 y+ i w! W. G; T& n% T, m
~/image/about.bmp , r1 j0 y) M) f6 F C2 z5 l% z* e$ x
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更+ N" W7 m4 g: X" D
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
5 [+ e6 P! R" E它。) o& M! M2 D8 }1 {# O
2. 在刷新和提交页面后,保存你的页面滚动条的位置
" s! z% L* p9 o+ w6 k4 E" x 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说6 k! i2 ^7 a9 C" m: q
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸0 E7 ~0 Z/ a7 J: T
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方# s8 p" }1 D/ s6 Z2 P$ e+ f7 g- r
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3709 U# H' i O$ X
个控件又需要他选择一下?
, z) K4 [: U7 R. p8 [: ?2 r 用下面的方法可以很快地确定和记住你提交前的位置。 }( ]- ~- q2 k9 L
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,8 ~3 k( @0 v* z6 m
不过他使用了Web Behavior这意味着你需要使用一个.htc文件9 K) w+ v* Y+ Y, f V/ A& M) `
Private Sub RetainScrollPosition(); Q! ^: x( X( | X1 ]7 U
Dim saveScrollPosition As New StringBuilder. i6 ~4 s! s7 y# p3 k6 x
Dim setScrollPosition As New StringBuilder
, k& _" M0 P0 W* `RegisterHiddenField("__SCROLLPOS", "0")
/ |" E6 q" {- ]5 DsaveScrollPosition.Append("<script language='javascript'>")/ ^; A4 S3 y& b* a; t) H4 H3 {
saveScrollPosition.Append("function saveScrollPosition() {")* z7 r8 H/ j! S! r& P0 c
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")8 A! e: U) I1 s' w: \, j
saveScrollPosition.Append("}")
/ u0 m! ]5 q7 G- ?! z3 H* f0 M4 u* lsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
* U6 d& _# [" Z7 F. ?* k4 q. usaveScrollPosition.Append("</script>")$ l& d. K; U+ s: s: L
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())& ? ~2 @( e' \, @8 Q) E
If (Page.IsPostBack = True) Then$ {7 s" k8 R0 d k
setScrollPosition.Append("<script language='javascript'>")/ b6 B( O# } G+ J
setScrollPosition.Append("function setScrollPosition() {")' E- c' d# c# {/ e5 f) o+ I
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")0 T ^" \2 j- ~7 H$ ?
setScrollPosition.Append("}")
$ Y9 U2 p8 c+ nsetScrollPosition.Append("document.body.onload=setScrollPosition;")! Z( s! O, g8 A
setScrollPosition.Append("</script>")
7 y; x4 O+ T) tRegisterStartupScript("setScroll", setScrollPosition.ToString()); c& k: F$ r8 W4 P
End If
* u0 @. Q+ b" k. V6 VEnd Sub
. z: v, Y" W! a fPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles + @+ U) M, e3 t( u5 {
MyBase.Load
1 I8 @) h6 e2 Q0 U- ]+ w4 sRetainScrollPosition()# T: @% ?& Q' Y# [0 p5 }$ {
End Sub ) f7 y* a. N2 o. B$ V2 g
- n& f G, Q; Q; q( l- v, l1 R
3. DataList使用不同风格的模板
E7 i6 W: S: v 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
% b. l; P( J4 j9 d1 k" t件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
' s3 q+ X9 I/ F8 O元素或是加一个促销广告图等等。
) z# l! H* \6 f+ B: A Q b0 fDim theme As String
5 `2 o2 `. A( |: vtheme = DropDownList1.SelectedValue
6 X; ^- i1 f6 ]) H. Z2 m+ E5 qDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool% T$ w& O; G @2 A7 ?- y: O, |
DataList1.DataSource = DS
8 \8 t6 o6 q3 e3 I! L' W3 {& BDataList1.DataBind()
* J6 A) U( t* t& b) V! g3 B, T, h 4. 设置服务器端控件的焦点4 q3 m4 N$ E! @$ A& C% C
Private Sub SetFocus(ByVal controlToFocus As Control)! e+ L# w1 e5 L. b. W
Dim scriptFunction As New StringBuilder3 U% m6 f8 S, I, H
Dim scriptClientId As String( F/ G* Q; @1 t, B: M4 a
scriptClientId = controlToFocus.ClientID
0 S3 m# b5 `+ c4 |' ]+ q5 WscriptFunction.Append("<script language='javascript'>")
% z9 D( r5 u" J: w- P @; CscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
4 K {/ T Z7 ~ TscriptFunction.Append("</script>")
2 R3 r; d% m B7 l% H& R" ^RegisterStartupScript("focus", scriptFunction.ToString())
+ d+ k% `/ o. T4 I( b1 K: oEnd Sub4 K6 X+ P% @3 _3 @1 j* H6 B; p" W
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ( {3 m* `9 v9 k: `* t6 T. F$ p
MyBase.Load
/ a/ S# s9 q1 K! M8 u: F8 g" A$ GIf (Page.IsPostBack = False) Then
( d! h( z% l" k: }* NSetFocus(TextBox1)
8 T# g6 T1 d0 _1 i, LEnd If
* q4 O( _$ R( Y2 r3 U, a: gEnd Sub . q% x I, F3 V* o0 k, B7 ~
5. 滚动DataGrid8 n+ Z$ C" g, ^4 \! k* N
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
- m. h. x1 F5 N: Y0 k' X1 {有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控# b: T# k. B* y- s; a* B
件放在一个DIV中将overflow属性设置成auto6 C0 t6 w: D- H
<div style=“height:400px;width:200px;overflow:auto”>; n( J! R( p* K5 B# [: d
<asp:datagrid id=“MyGrid” runat=“server”/>) x) e1 Z4 C% o: F* S( D7 t
</div>
% F( P2 \8 Z* O6 }1 `) u9 T- S 6. 动态创建控件
$ a* R& Q8 M3 j5 f; y e: w 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。8 C5 s; g! Y) W' c+ z7 O) _9 {. M
Sub Page_Load()
1 `4 h3 A+ N: X. d6 e# tDim i as Integer
( `" d& d- O6 Q6 X( Y4 g+ j; c bFor i=0 to 4
0 A) T7 o1 [4 q/ W2 u' uDim myUserControl as Control
: R% d/ y, s3 i; umyUserControl = Page.LoadControl(“foo.ascx”)# @# e9 D0 z! x
PlaceHolder1.Controls.Add(myUserControl)
# E' {- |4 @: r# [. ePlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
4 c: c0 Y2 w5 S( [Next i
; Y4 s8 w3 g9 V( u; A. sEnd Sub
7 `4 T7 {6 t1 y" N 7. 客户端代码的使用
9 u: @6 e. n5 _, H. V1 H! r 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
& }+ R/ b7 x% c, y4 r' H4 [" F$ J- w准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
: t8 t* H2 W8 uasp:ImageButton id=“foo”
7 k% }4 m, n* GImageUrl=“start.jpg” U8 X2 b o5 t% Z. |1 e( q
onMouseOver=“rollover(this);” 7 Y7 J/ T0 @' a4 ?5 A6 k" M' Y
onMouseOut=“rollout(this)”* D1 A/ G, h1 `( G% S0 ?4 S
rolloversrc=“myrollover.jpg”
) j" C5 Y) d/ krolloutsrc=“myrollout.jpg”2 w; c, g9 b( B( R# I6 F
runat=“server”/>
4 U: E3 g" j1 M* K<input type=Button onClick=“return clientHandler()”
* u7 y) v5 K; Z2 S2 i' t2 |4 v, MonServerClick=“Button1_Click” … />
2 O$ V! }( B0 t' R' W5 ^) V1 A e: | 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
9 X8 {& k$ s6 P# C, r' H1 U: Q有的客户端控件。$ O6 }: N& F# h9 \1 V0 s
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 0 B+ r6 S' \ S0 z' w
MyBase.Load' _! s9 ?7 U# ? g; Q
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
1 Q3 U9 [9 A6 u2 N$ R- dEnd Sub * @+ q0 }1 h" K# ~ E7 J
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|