TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需+ B" G1 w H8 f* o' Y
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。/ y- }/ i( t: C9 G0 i
1. ~ 的用法; K, d& Z; B1 r, U) n9 r/ D1 G
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方+ w' \% Z* O, m- k# K
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
; p: @$ H2 K* o, X& k8 B0 J* q同层次的两个目录的aspx文件分别引用时,问题就会出现了。
3 S8 C) V' B* F; F% f* x$ Z ~/image/about.bmp
. C- X" u! n$ y9 p5 G是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
& z& N! v8 ]) @+ g' b加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
. `: r6 X7 P# b y0 I2 O* G0 O6 I它。
# `) F/ q1 G5 C- E7 \ V+ T ^ 2. 在刷新和提交页面后,保存你的页面滚动条的位置
$ ?1 X% E" ?% f" A' ~5 T 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
& P. h$ j5 B4 h# I; \5 i2 d) w2 v用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸4 m% _( W# g! U) i; j# O& M
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方& V* N# z, @) Z2 x( Z" L m
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
, S- V2 ]$ U; e个控件又需要他选择一下? 0 |) f# J, K% o' `. \. e
用下面的方法可以很快地确定和记住你提交前的位置。
N) a/ I- l+ c$ C { 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
7 o- }0 f( W* y8 [, `: z+ \不过他使用了Web Behavior这意味着你需要使用一个.htc文件
/ m$ \3 O0 H8 V a% w7 |Private Sub RetainScrollPosition()
6 y( P2 g l2 vDim saveScrollPosition As New StringBuilder" G- K# U( i& \# k0 H }
Dim setScrollPosition As New StringBuilder: u; L6 ?" P8 D; J( L' l+ ?
RegisterHiddenField("__SCROLLPOS", "0")
& W, x1 K* U2 U& b" T2 k; [! |. hsaveScrollPosition.Append("<script language='javascript'>")3 `2 b- A- C) }. g" d
saveScrollPosition.Append("function saveScrollPosition() {")4 X" P4 u: n4 j8 v2 c
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")3 _0 E. I, T& C
saveScrollPosition.Append("}")
" j: V1 [) [6 Q+ Y/ X/ OsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")" V) D6 I$ R' t; a: T. b0 |" v
saveScrollPosition.Append("</script>")3 c9 X! i. g( Q" t; w6 _, q5 @3 i
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
7 ?/ D& J& `" g& n* JIf (Page.IsPostBack = True) Then
1 I: d) |! ~9 D! N! RsetScrollPosition.Append("<script language='javascript'>")
# h M; r' B& W* osetScrollPosition.Append("function setScrollPosition() {")
8 T# `/ b, g+ Y$ q( z* IsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
8 a8 ~, {7 m, z) i8 KsetScrollPosition.Append("}"). C" a4 z; K! N/ }" h% n
setScrollPosition.Append("document.body.onload=setScrollPosition;")
0 b* E" e: ~& t \setScrollPosition.Append("</script>")
% u) C4 H4 h. K4 ARegisterStartupScript("setScroll", setScrollPosition.ToString())
1 V" W# B3 N' W3 i! _4 J& r" X: UEnd If
& X1 s G0 z! X% x/ H" r/ Q! V! IEnd Sub4 m* _4 U. [; o( b& x0 n1 i
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 3 t0 Q: _( x* U9 I
MyBase.Load
9 i0 E3 E$ u% T1 U$ z1 m8 I! WRetainScrollPosition()
1 s$ l O8 H% b9 Q6 G* B9 xEnd Sub 6 Q( ~9 @1 L# g$ b, b4 I
' ~) {% s0 k6 c$ E/ U9 @3. DataList使用不同风格的模板
3 i& ^% |9 s7 o; D* z+ [6 L/ O) k/ ~! q 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条; u/ {& c- l8 [# M0 m# m" o
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
* T) C8 X5 Z6 n5 A元素或是加一个促销广告图等等。
* n, ^) V y+ ]' Y! JDim theme As String
- g4 l$ J8 I8 ]3 Q5 htheme = DropDownList1.SelectedValue
C8 K5 N# B8 n( ~1 iDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
- u- t5 A, H& Q& CDataList1.DataSource = DS
0 g9 \7 d" A3 ~; g% f' c% ^7 |DataList1.DataBind() . N. U6 S5 h9 `; U9 M5 K B Z
4. 设置服务器端控件的焦点
0 a6 K. Y3 V3 M3 Y: U5 I, F( wPrivate Sub SetFocus(ByVal controlToFocus As Control)9 F5 J7 H% v2 U! ^1 P* V: h
Dim scriptFunction As New StringBuilder7 \. e" N/ u% [& n+ a5 E
Dim scriptClientId As String0 K% w" C& v4 l2 a3 j4 G. G/ a
scriptClientId = controlToFocus.ClientID
* w5 s: e( d9 o: y' m0 S; GscriptFunction.Append("<script language='javascript'>")" m9 S- v1 ^+ \8 X9 `! J
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
" b% p8 j) J2 L1 ^5 `9 pscriptFunction.Append("</script>")
2 N F, I7 _0 Z. M( U+ TRegisterStartupScript("focus", scriptFunction.ToString())
' w; |, e' {' O' BEnd Sub% z, ~$ H; o7 r: E
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
i# E8 N4 M6 n3 IMyBase.Load
3 d' S4 u8 X, U; J W+ rIf (Page.IsPostBack = False) Then, S1 g+ h h( A2 ^1 D9 j. [
SetFocus(TextBox1)
. U u7 L3 S) c) Z, U/ ^End If
* E! i* D* `0 K8 r8 f$ pEnd Sub * w+ ^2 {% r d* Q' {9 u
5. 滚动DataGrid& l$ B+ f* [& G$ W
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只9 B8 u$ R' U+ n; Z- L
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控* v: N4 u, n8 }) `
件放在一个DIV中将overflow属性设置成auto* ]( Q% q f" M! C- @/ U
<div style=“height:400px;width:200px;overflow:auto”>
/ T) m/ Y( n, G. V2 E<asp:datagrid id=“MyGrid” runat=“server”/>) }" x9 Y, H* x( h% }& p" E( C* F
</div>
" Q; t3 s3 v, o+ w 6. 动态创建控件
! N* J4 ]: `4 N4 k+ P 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。3 W1 b' c( u0 `" P4 b
Sub Page_Load()" V9 |7 c4 H% ^& `4 m7 Y9 i
Dim i as Integer
+ a$ [5 d+ [4 t! L9 HFor i=0 to 4
2 I8 S, H/ w. r4 @Dim myUserControl as Control( N6 [1 C8 L; { L
myUserControl = Page.LoadControl(“foo.ascx”); b) |+ \' k6 J
PlaceHolder1.Controls.Add(myUserControl)
7 x( D- ~* {/ I; @- S }PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
/ U, @/ C& ^ v4 n" F& kNext i2 ~% z6 a+ `8 B+ [# g% B- _
End Sub
0 e6 G1 V* o9 E Y 7. 客户端代码的使用
& l1 r) k* m9 l- i 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标: @* X3 ~- W! ?# l3 |* M
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性: J/ g% \# P- @* ]6 @5 a& n* u, t
asp:ImageButton id=“foo”
$ S( \' E9 ` o9 fImageUrl=“start.jpg”% T$ `3 i. l9 c; N- B& a) V
onMouseOver=“rollover(this);”
1 N- o: H- R, l; N- sonMouseOut=“rollout(this)”
8 F. g# A1 m: k6 c+ \+ d/ drolloversrc=“myrollover.jpg”9 z# g* X" l* d1 O
rolloutsrc=“myrollout.jpg”4 r& P' a, D& ^, ?* K" P' {. _
runat=“server”/>
/ S, d$ U: Y3 M0 ?; e4 t<input type=Button onClick=“return clientHandler()” / @$ J: k0 _0 y/ a% r
onServerClick=“Button1_Click” … /> : t: H9 B8 W- y* F) g. g5 D' g5 q' k
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所% F( }; [: o3 y6 G1 M, F& j
有的客户端控件。4 v. J" u3 j! k/ k _6 G& A% k8 y
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
6 l6 r& M+ v, v+ X- Y2 x6 iMyBase.Load5 J. }5 D) F! Z) M& d8 b
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")" Q0 o% X5 b' r9 O
End Sub
2 K% M: M: l/ ]1 y 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|