TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需7 Z" n% ~6 r3 i, A0 c+ H
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
$ K7 J& m* V, @- k) o# Y/ @' e3 w 1. ~ 的用法
$ o, l6 K7 M6 a$ ^ 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
$ D, x4 h* u( i1 L% J9 w5 _式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不1 L/ t, I! ~/ [3 o6 N) C q4 g
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
4 R; c4 K4 [% ^/ I ~/image/about.bmp + [3 U$ m9 N8 N- x/ r8 Z: `
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更( |9 a5 \$ l& T: n0 m
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
& c2 Q& _! X8 r1 Y$ B它。
: H5 D+ I2 s; g0 k( ] 2. 在刷新和提交页面后,保存你的页面滚动条的位置
1 @( L2 S% Z; d3 _ 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
# h6 @9 F% V; b3 G" Z# G: d用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
5 d7 ~& h7 z; W组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
+ T) g9 h4 s3 I也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370& e% B$ ]' J0 a% a: J. f6 m
个控件又需要他选择一下? * L, L$ J8 w. H G$ S; T7 H% t* t
用下面的方法可以很快地确定和记住你提交前的位置。
# L) A! T, I5 f4 R+ S; E+ R8 @ 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,2 s: Y9 P$ _6 @. p& h0 W0 N
不过他使用了Web Behavior这意味着你需要使用一个.htc文件: ]- ~* E: h, O! c& h* t* P
Private Sub RetainScrollPosition()
0 H( c; N/ k& u5 c$ ADim saveScrollPosition As New StringBuilder
1 M, d3 X- j* M3 pDim setScrollPosition As New StringBuilder5 N Q: K- z) |% _; D8 x2 [: J
RegisterHiddenField("__SCROLLPOS", "0")
. S" b" F4 [/ c3 HsaveScrollPosition.Append("<script language='javascript'>")
; a' R! _# b/ rsaveScrollPosition.Append("function saveScrollPosition() {")6 {) G5 L& v, H4 Z% G
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
1 Z" m/ W* J7 `saveScrollPosition.Append("}")
0 s) W. B4 d8 z1 D/ d5 b* p# v+ ksaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
" M- Z+ _" k# L6 _( c( q* osaveScrollPosition.Append("</script>")
) Q4 G5 N# F" y. J. Y/ x X8 aRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
: O) i" I# O: \" M6 h3 M: jIf (Page.IsPostBack = True) Then
9 W" b: O( k& @6 l4 [7 AsetScrollPosition.Append("<script language='javascript'>")
! t( S/ _: P2 d4 x% JsetScrollPosition.Append("function setScrollPosition() {")
& Z& `, s' K! U. Z% F! gsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";"): f& e3 Z. ~! v' ?, K
setScrollPosition.Append("}")
P& @9 w* c3 l) GsetScrollPosition.Append("document.body.onload=setScrollPosition;")
) o" c @0 y% fsetScrollPosition.Append("</script>")
3 X6 c" t' ?1 c' H/ rRegisterStartupScript("setScroll", setScrollPosition.ToString())
' e7 u3 O0 x" L) e+ [End If
8 O$ c; v( p- b7 Y- }9 CEnd Sub
' C0 J% Z7 F% QPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
1 o$ g4 T0 K. C" t3 [, {- ^MyBase.Load0 a) T6 w: [, V7 K! o2 s9 w: I
RetainScrollPosition()
3 {5 ^( E, s$ _) }End Sub $ J6 A8 j0 l/ t6 W
- V, `$ X' Y, D, { z5 r+ ~
3. DataList使用不同风格的模板
" |7 D! x, G- a' R5 ~* w0 ]5 e 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
5 n: x6 z. k6 Q' W6 i% [件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
% x6 f( S: X+ `, Q1 j$ g4 X元素或是加一个促销广告图等等。
# X4 l+ i% b4 p5 d* G7 y+ M; ]7 C; QDim theme As String" X/ S/ o, u- E$ K
theme = DropDownList1.SelectedValue
8 X$ v- y: }7 L7 h4 ~; sDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
: r4 L5 I+ S$ u; B+ U$ f% \( \5 ODataList1.DataSource = DS0 Y9 c/ z3 l: `$ s" O
DataList1.DataBind() * D" _( z6 h# l& ^7 j) r
4. 设置服务器端控件的焦点3 r1 n( T' l) F: H7 v
Private Sub SetFocus(ByVal controlToFocus As Control)
6 m* J& s7 q' v5 Q1 d: vDim scriptFunction As New StringBuilder
: c7 F/ G' ~* m2 n* C8 |Dim scriptClientId As String9 \$ ?# v$ Z" P# X
scriptClientId = controlToFocus.ClientID: C! W" e/ L R3 W1 K
scriptFunction.Append("<script language='javascript'>")% D7 ?2 z: W6 {4 f, n5 M; ]
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();"). D1 E* p4 W& I# B
scriptFunction.Append("</script>")
6 L$ d" T' M# y G) ARegisterStartupScript("focus", scriptFunction.ToString())9 v. `3 d3 A* v
End Sub" K) v2 i' W+ W8 z$ k. R* l
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
$ C1 w# P, C% xMyBase.Load
% g, x* ]( y! _ z9 O- m3 E% Q4 vIf (Page.IsPostBack = False) Then
4 j/ t$ W0 T9 P; CSetFocus(TextBox1)
. G, r; _2 k5 p1 o" eEnd If9 s- M3 I0 I9 G6 _: G- W
End Sub
0 ]6 p7 [2 h7 x9 m7 E. b o 5. 滚动DataGrid
" j$ W8 a3 q+ ]0 F- i0 K 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只2 R0 {1 `) |( @9 Z" R( N
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控5 m1 c7 _- Z; C4 f( G* t
件放在一个DIV中将overflow属性设置成auto j5 \* @ m' x6 p/ F `- z
<div style=“height:400px;width:200px;overflow:auto”>
, A9 S, O* s5 Z3 ^$ p8 _! V3 g<asp:datagrid id=“MyGrid” runat=“server”/>5 E/ s7 g" S( W' x0 z9 Z8 X
</div> / L! \1 c/ S! x2 N" z
6. 动态创建控件0 O- |# C- t( K$ ~8 Y, F( A
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
* n- p7 F: W# s! r- ASub Page_Load()
" K8 }6 [+ |$ f+ J' xDim i as Integer
" j- |6 g& @/ S" VFor i=0 to 4 + x7 O6 c) l0 l: u4 U8 T0 {
Dim myUserControl as Control
( x4 M3 \! f. R' pmyUserControl = Page.LoadControl(“foo.ascx”)
$ @, R* ^6 H/ N! T* ~' K+ zPlaceHolder1.Controls.Add(myUserControl), r6 A$ h+ p( [& W* }; ]
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))# o4 o* q; h; }, |
Next i( w7 `$ f+ H8 P/ B% E6 q' |
End Sub
4 [+ `9 m- B' H$ Z8 ], [$ M: k0 ? 7. 客户端代码的使用
+ u* K* F8 s z$ }- J; U 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
% d! J% X% F) p% t# Y准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性" z( Y+ b* ?; c" X9 a/ }0 Z
asp:ImageButton id=“foo”
& J \. `5 {: d$ n+ i; |8 I& fImageUrl=“start.jpg”
% T& h" w; i5 Y/ R( O1 ponMouseOver=“rollover(this);” ( ~% t( R k% N3 G& d
onMouseOut=“rollout(this)”6 j& e! a, @3 G: h3 Y- x5 A, o" J# f
rolloversrc=“myrollover.jpg”8 {) T7 Q" B" |5 A- @2 [' O
rolloutsrc=“myrollout.jpg” N5 Q9 U6 K! S, v
runat=“server”/>' F4 r/ Z3 r9 E
<input type=Button onClick=“return clientHandler()” 8 k- g6 a$ L8 N7 {* i3 S. @# r3 T
onServerClick=“Button1_Click” … /> / w( ?2 w6 L' W0 x0 W4 }
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
1 _" q* P+ E7 G9 o( n& C. l有的客户端控件。
?; z$ Q3 r8 u5 |/ m0 `& zPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 9 o: s, @# R; [, V2 o
MyBase.Load4 G9 |& u1 u$ l5 c y$ a) P9 U' o- L
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")) X5 \6 {( |3 T. m
End Sub 2 g0 `2 M. O6 N% A( V# L
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|