TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
1 G4 H; ?0 g5 i7 T求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
. P0 S* H4 g9 I6 Z2 T \' y* S 1. ~ 的用法
0 J2 B% A1 ~0 V m* _0 R5 ^ 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方4 v0 [6 i9 B3 r1 M$ Q+ N" j
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不& e- B, n+ {- ~3 _$ ^. K, [
同层次的两个目录的aspx文件分别引用时,问题就会出现了。" {+ @) C$ s. M# c2 r
~/image/about.bmp & k. c) }: V3 o2 A0 Z) U( j
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
% z0 z- g) `: `2 _ a* \8 E8 d加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览2 m$ Y. i+ |3 U+ L8 C8 c
它。
1 d( F# d1 P0 F# {6 ^! b0 q 2. 在刷新和提交页面后,保存你的页面滚动条的位置+ v$ I, X* @- w$ P4 T; G4 i3 Z, @
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说1 H+ I2 Z, `$ s) V9 @
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸& {( S2 S/ d9 u4 b
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
4 A5 d0 a5 z" J" g2 P0 T也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3708 C) M6 u/ n7 G* C% h5 U# |2 Z5 d3 K
个控件又需要他选择一下?
& d! J! i+ t% J4 C4 C1 z& O 用下面的方法可以很快地确定和记住你提交前的位置。$ r$ J/ W0 R7 j- @
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,2 O* q7 ~( S+ L) v! S
不过他使用了Web Behavior这意味着你需要使用一个.htc文件9 d* N1 R. p) f1 l/ q, `
Private Sub RetainScrollPosition(), p( R/ O8 h6 {0 W3 |
Dim saveScrollPosition As New StringBuilder% l4 x+ T2 p$ m _" w( H: C' n
Dim setScrollPosition As New StringBuilder+ l3 b3 m. x3 B# E) ?
RegisterHiddenField("__SCROLLPOS", "0")4 w9 c4 A, H+ b+ e
saveScrollPosition.Append("<script language='javascript'>")6 s Z" E1 w% c% [5 d( w
saveScrollPosition.Append("function saveScrollPosition() {")
1 c5 I5 d% B: ^1 g$ P' tsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")' Y8 i7 L3 f4 S F* B/ C" M. ]
saveScrollPosition.Append("}")% k3 v6 c& l9 N' d$ b! {8 k0 _
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")8 ?0 _7 _: r) i; }7 {" f. n6 r% ?
saveScrollPosition.Append("</script>")6 ^0 j- | S, T; e
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
- t. ]9 A: E# e( ~If (Page.IsPostBack = True) Then) H: j/ l+ ~0 k# R8 H z: s' S+ w" r& @6 i
setScrollPosition.Append("<script language='javascript'>"); _" [, d3 x2 u& D: f2 r& P
setScrollPosition.Append("function setScrollPosition() {")
: R+ d3 }8 V: _- i- s# D ~setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")3 O9 k) [. g2 M% i% V
setScrollPosition.Append("}")+ p/ G J7 H x
setScrollPosition.Append("document.body.onload=setScrollPosition;")
( g3 ^& G8 \* H4 q q/ T% p9 W; s) UsetScrollPosition.Append("</script>"), E. i0 X1 K! \# t( G g% r9 ?
RegisterStartupScript("setScroll", setScrollPosition.ToString())* l% @5 n: I `+ b( E; W9 F
End If
' H! Q& o) j& }- ]2 B, lEnd Sub
' l& L% z0 u7 w5 w' MPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
4 p4 `3 i2 r! _% N2 Q% WMyBase.Load
/ U7 b- K2 y! ]* |) H! Q4 kRetainScrollPosition()
+ u7 J; y0 J/ Y2 V5 LEnd Sub , m6 l# M ~; i: c: o3 \
1 g% P7 L3 _7 N ?; Y# _1 @3. DataList使用不同风格的模板
( M& ~4 Z, y' ?: o$ ]. A% X 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
! |4 i6 d3 C! D$ u2 H, Z件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
5 ?. s# K5 ^# z, I* p元素或是加一个促销广告图等等。
1 R! L5 ~4 i. W& S+ t2 a# bDim theme As String
( G1 B! r5 v6 F2 [( @theme = DropDownList1.SelectedValue
M8 v" d; E/ m6 \- t" @DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool- Y9 t# q7 X! S4 }
DataList1.DataSource = DS
( Z% p$ {0 C/ N, F4 c( k* a, {- ~DataList1.DataBind() 9 \ h/ {( |% i& I Y! Q3 D
4. 设置服务器端控件的焦点8 C1 Q. z4 R/ ^& Y, ^% p' F
Private Sub SetFocus(ByVal controlToFocus As Control)
. U; n4 F# y& f. u: [% Q7 MDim scriptFunction As New StringBuilder
' w" Y% ~0 _2 m% @. m$ ?, i4 HDim scriptClientId As String
% N! Z$ W; N- jscriptClientId = controlToFocus.ClientID
. S( Y: h3 b1 \/ y* jscriptFunction.Append("<script language='javascript'>")9 b* n* i1 a3 d/ i3 |8 T" ?9 @" ~
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
+ _" r- g! V1 k1 Q8 K9 f1 t3 c- WscriptFunction.Append("</script>")
: x) |+ Q0 c2 D) s7 F& f6 rRegisterStartupScript("focus", scriptFunction.ToString())% y! d# }0 j: v% Y' i d
End Sub
0 b% Y- [. [$ \! D3 N! P- {Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 8 m& E) P! T8 w2 G# ]
MyBase.Load) i- n7 J6 Y' R- O- m/ @
If (Page.IsPostBack = False) Then* q5 ]% K/ c( G3 ~) y" N: l
SetFocus(TextBox1)
$ j% H# y- H! X6 OEnd If6 k# F* G ^8 }" V* k$ Y! F$ M6 g8 f
End Sub
' e6 v% S+ M* _- V 5. 滚动DataGrid' |* g' C3 k9 p2 S6 y& ~
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只- E3 M% Y2 M) X8 V
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控: S' k$ C8 ?! k1 Z
件放在一个DIV中将overflow属性设置成auto
- N, a# M8 S5 Z! c# P3 K q+ q( h<div style=“height:400px;width:200px;overflow:auto”>/ {7 {7 ^* m% M! n
<asp:datagrid id=“MyGrid” runat=“server”/>+ ?. J; p: a. x/ B& m7 }
</div> / A; B; w! o0 s6 P
6. 动态创建控件1 Y, A6 @( N; K; u x
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。; e+ o+ J: {& G+ k. z
Sub Page_Load()+ U6 H! A$ i$ b$ k
Dim i as Integer! ^/ |- f, b+ v5 F+ J
For i=0 to 4
9 t: V2 \( s6 J3 zDim myUserControl as Control
1 P: K6 m. w2 `% Y tmyUserControl = Page.LoadControl(“foo.ascx”)3 }" q# r9 b4 c! ^
PlaceHolder1.Controls.Add(myUserControl)
- i- }! v; }1 a" QPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))5 p8 s: z" _) Z K$ U
Next i( E R' L3 t0 q4 y
End Sub
\ S/ V9 L" x) S8 k" E 7. 客户端代码的使用5 z* }5 X$ G; @- S+ ?( b4 a9 l
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
. x$ z$ G/ I8 N/ m准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
9 t- k0 a4 r; Y# P5 j/ Basp:ImageButton id=“foo” # b7 S9 U9 O/ Y( v D1 Q/ m
ImageUrl=“start.jpg”
: E6 u$ |8 k7 ^) A2 f# Y! Y( p0 YonMouseOver=“rollover(this);”
8 h, b( E( K1 z) p4 N) WonMouseOut=“rollout(this)” R7 V- F! e/ r0 n4 ~( [
rolloversrc=“myrollover.jpg”
" T/ Y }- w4 N# }" [& Lrolloutsrc=“myrollout.jpg”; F1 M" l z9 K$ ?; }, o! i3 y9 R2 w B
runat=“server”/>. M( O0 m4 j/ l& T9 N3 G
<input type=Button onClick=“return clientHandler()”
& I* i" U$ f- }3 VonServerClick=“Button1_Click” … /> 0 J5 d4 U- V4 F. T
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所4 ?# `; Z. ^% s8 F6 S
有的客户端控件。
) @$ K) e: ?1 @& Z6 P1 MPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
# A) `: b: n' }# J$ }/ x: q# pMyBase.Load
3 @/ B! p4 i( @- l% O RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")% h7 d; W+ h. W: g) ~
End Sub
, i0 T$ ]- N/ i- O! Q& p2 Y5 } 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|