TA的每日心情 | 衰 2019-8-18 09:37 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
9 B$ M; G2 t4 G: X f求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。( y7 \! V/ y5 d* i- b6 ~
1. ~ 的用法
0 Y( L8 H) Y; W. J( ^ 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方4 h4 H# O- m% j* V
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不$ K0 w, X/ h/ E& N7 D6 u! W2 X) @- Y {
同层次的两个目录的aspx文件分别引用时,问题就会出现了。4 ]0 C- \, h- b5 e* m$ @
~/image/about.bmp
* Q4 v' S% j/ B3 f是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
# M- e! T! r- c! Z7 T加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
* m2 V% v$ B. s, p9 J它。
Q* v U- H# ^( T5 L& J/ a 2. 在刷新和提交页面后,保存你的页面滚动条的位置3 w" @. ?% _, u5 P# I- R# U
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说/ D7 A+ c# T. Y! [& Y- e
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸9 C$ V9 ?9 _+ E; O7 b( a
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方' z* [: B2 L/ J
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
, o9 h: }% F; i' M8 `/ |- K个控件又需要他选择一下? ( | k$ k' F, w' J. a
用下面的方法可以很快地确定和记住你提交前的位置。
0 d) Y) a6 {! C5 ~5 p 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
6 k, a- ]6 B; v+ e* W) U3 [不过他使用了Web Behavior这意味着你需要使用一个.htc文件
9 o3 j7 S3 b7 B% A% U( [Private Sub RetainScrollPosition()
& @$ B+ o& q, P8 QDim saveScrollPosition As New StringBuilder
( R6 h) |9 a. t3 qDim setScrollPosition As New StringBuilder
5 A! Y9 P1 m' R$ |: X" ?% H& I& M( HRegisterHiddenField("__SCROLLPOS", "0")1 e4 y4 K( m; x
saveScrollPosition.Append("<script language='javascript'>")6 o. Z6 i7 R2 q: W6 R
saveScrollPosition.Append("function saveScrollPosition() {")
0 E7 W! _2 f* o; |9 j4 A; VsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
, K! Y' s# P$ ?2 ]! l: S8 MsaveScrollPosition.Append("}")! l' h% n4 ]2 V
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")- s9 T( a+ b, s& p! f4 b' \: C
saveScrollPosition.Append("</script>")
8 `1 r* A: p2 qRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
$ _. i& B1 z$ S. X% f7 o1 mIf (Page.IsPostBack = True) Then
4 |" c2 |6 c# k7 T( t6 xsetScrollPosition.Append("<script language='javascript'>")
5 \' T& j. O3 n: Z7 vsetScrollPosition.Append("function setScrollPosition() {")
- Z1 I) W# A4 V/ W0 i& \# xsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
1 |+ P) U$ r3 Y# }# K9 k$ AsetScrollPosition.Append("}")
+ ^0 h2 x2 _+ Q! [setScrollPosition.Append("document.body.onload=setScrollPosition;")
0 u4 r6 ]) U+ [: ]setScrollPosition.Append("</script>")& ]) ^ d$ H Q$ v" |# x" U4 S
RegisterStartupScript("setScroll", setScrollPosition.ToString())5 o1 p5 g) i2 _# p4 b! b
End If2 F$ f, ? |" Y) h. t2 }- `* {
End Sub8 U* M7 z% b1 X/ K/ l" w7 e' q4 \
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
# n2 Z! j5 h2 |8 C" v7 AMyBase.Load# m; A2 B- N7 k s4 N
RetainScrollPosition()' t* k+ D: K3 G, z0 V( }; G
End Sub , M* g8 V/ w, N9 X6 v
8 @0 V4 A7 ]/ g* ?) I h8 Q
3. DataList使用不同风格的模板5 F( m3 I8 h7 \% t* w! }
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条3 L+ U7 M3 r' A: {! J
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
3 P/ r; D( {, T& {( M& i元素或是加一个促销广告图等等。
% v `5 Q# z2 A6 F7 a& RDim theme As String
% e9 |+ w6 v7 i. a; X# ?( o( c: Wtheme = DropDownList1.SelectedValue
- X) Z0 N$ X/ K5 Q. ]- }: E: fDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool, ]0 c9 q, C9 U+ C& F& j
DataList1.DataSource = DS
1 y2 ~9 Y+ k& u, Z. `) jDataList1.DataBind()
* L, h8 d4 x; A0 S9 I 4. 设置服务器端控件的焦点, P6 [, _" c3 ]4 g/ p1 W
Private Sub SetFocus(ByVal controlToFocus As Control)4 \3 B: D' R, Z9 E; f
Dim scriptFunction As New StringBuilder
- n5 T) V6 E& Q# u3 {$ NDim scriptClientId As String; r. U/ B+ N: x- ^0 P* y! ^) V
scriptClientId = controlToFocus.ClientID
. `* J1 B* L" h2 c# HscriptFunction.Append("<script language='javascript'>") o X8 s. F9 f& b! j4 s
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
1 T8 A6 u2 R, LscriptFunction.Append("</script>")! s3 D# l6 @2 n# p
RegisterStartupScript("focus", scriptFunction.ToString()), W& X4 d5 m$ p( f& S$ M3 d
End Sub
# ~- O7 J2 L APrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
1 i; u3 Q6 G: G' aMyBase.Load
9 S5 Y/ E# a' Q+ hIf (Page.IsPostBack = False) Then
9 G3 u, }1 ^6 V8 ]SetFocus(TextBox1)
* c0 ^5 v$ ]( Y/ o! P3 iEnd If
5 _3 ]* D% v Y# LEnd Sub
% E! e3 W! u8 S2 ] 5. 滚动DataGrid2 ~4 H! u; E" d+ N
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只: g8 o' b8 G+ }; [$ h+ \6 ^ j
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
& |2 M f: f( K$ v件放在一个DIV中将overflow属性设置成auto
' m4 c+ k* S. t( m& V<div style=“height:400px;width:200px;overflow:auto”>6 T$ g4 W- G3 G5 t8 ]! Z1 Z9 x
<asp:datagrid id=“MyGrid” runat=“server”/>2 n) J! T; p4 K, s/ B
</div> $ T- L( z: V2 F" T n2 N( y l# q2 N9 s
6. 动态创建控件( b3 W) R! J! e/ A) ~* w
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。7 o7 J9 ?+ T- N3 P( |# o
Sub Page_Load(), s( t0 v1 ]9 C, K( j
Dim i as Integer
: c# G/ C* m1 k4 _ D; rFor i=0 to 4 % {/ ^9 y' O c7 N
Dim myUserControl as Control
7 C7 F G6 K( k5 I; l! `myUserControl = Page.LoadControl(“foo.ascx”)) p7 v) Q5 h t
PlaceHolder1.Controls.Add(myUserControl)
9 t1 u0 v' r4 a, c1 w! E- m: _PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))+ Z% b4 A: ?; X& L j$ ~8 ]
Next i( I6 I3 ^4 L7 L+ x8 H
End Sub p, x& n% p, x
7. 客户端代码的使用+ {3 E+ s' ?8 H! D' }
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标) B' G6 P5 o( W! G
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性! C% a/ Q' S' o" V, ^
asp:ImageButton id=“foo” & t1 ^0 P0 |& \+ h) R( E2 ` R
ImageUrl=“start.jpg”
7 I- a- ]* m0 f+ f. xonMouseOver=“rollover(this);” . |( W/ q$ r; H- a
onMouseOut=“rollout(this)”8 j: l" u1 P$ F
rolloversrc=“myrollover.jpg”: \- g i0 u9 b. H
rolloutsrc=“myrollout.jpg”
t2 |# k: h7 hrunat=“server”/>$ V6 j/ A, y: ^0 ^, @
<input type=Button onClick=“return clientHandler()” 9 I/ X% k. k& T8 a1 w( n: f
onServerClick=“Button1_Click” … /> c% [( Q' M# ?2 M4 ^6 v- h* P* W
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
8 R! U8 A; l3 W# E, P# s# v0 I9 Y& S有的客户端控件。
, ?' z0 Z7 Y/ i& H& w5 WPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
3 F) t) p8 D4 t% G& C) x) J P! rMyBase.Load
3 I7 p2 X) y5 ]' t RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
( V- v. ~; E' J3 C, U. ]' k5 nEnd Sub 6 g" ^. \( S" t
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|