TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需1 J7 Q3 v: G1 J9 R' t2 Y, x5 i# L: o
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。, M: p- u6 m* Y$ `
1. ~ 的用法
+ d) R8 A R, J: { 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
7 t. ?8 `- O' P9 i) L0 G% c" A2 l* V% _8 |式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
! E) P1 ~# c1 O' A5 b2 @同层次的两个目录的aspx文件分别引用时,问题就会出现了。
1 K* _9 @1 j* W, H- K ~/image/about.bmp 8 ?; z$ U" x) z" ]- r& A8 t
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
; [( b ^2 N& \# |加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览$ B) n- ?' l6 `/ H( s7 }
它。/ G- a( y; l6 F* a0 h* m
2. 在刷新和提交页面后,保存你的页面滚动条的位置
) E# a- Z+ l+ C! V' X 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
& P9 R# K5 q5 t) e用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
1 }3 \ l" Q& o9 P7 Q$ f组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方" }: J2 C* O% m( z3 E4 I3 j9 ]# G
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
3 B' @: ?; r6 R& b7 M4 a个控件又需要他选择一下? ( W, ]5 K. u& @0 H3 d# B4 C
用下面的方法可以很快地确定和记住你提交前的位置。8 Y5 \2 p0 n) L9 L- M/ v' M
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,- B. m1 Y0 ^) q- k; P, ]' r* Y
不过他使用了Web Behavior这意味着你需要使用一个.htc文件# [ `+ V- B5 D1 @5 R2 r4 H9 e
Private Sub RetainScrollPosition()
& w, b4 h4 Y2 w, pDim saveScrollPosition As New StringBuilder* E1 b9 j0 K/ _
Dim setScrollPosition As New StringBuilder
; B& p( t3 _1 `8 s% u7 H% r- gRegisterHiddenField("__SCROLLPOS", "0")
. l& t3 o- F2 _* UsaveScrollPosition.Append("<script language='javascript'>")
/ C& n3 V0 Z& s& U; u4 rsaveScrollPosition.Append("function saveScrollPosition() {")6 S- T. _+ N, o' g) }0 z: U
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;") S5 Z* t4 Y; E/ C3 f6 y
saveScrollPosition.Append("}")
/ r; Y. J+ k0 G+ J* ?saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;"). I5 V+ T$ X" [9 L& P% f
saveScrollPosition.Append("</script>")* M" \. \! M" Z8 ~6 X
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())& f. w2 L6 V) p# I
If (Page.IsPostBack = True) Then3 P1 o7 w! P7 y# [# J4 H
setScrollPosition.Append("<script language='javascript'>")+ k0 y8 x) t1 X% j
setScrollPosition.Append("function setScrollPosition() {"); B/ V. @( @" P! R
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";") K8 s+ w% m; p, o' B+ K
setScrollPosition.Append("}")) z4 R' N' c0 p2 ?
setScrollPosition.Append("document.body.onload=setScrollPosition;")9 E, U, l( R; O* i/ Z
setScrollPosition.Append("</script>")7 V. [+ s5 ^( h
RegisterStartupScript("setScroll", setScrollPosition.ToString())* Z K" S( x* ~/ i6 l
End If
5 L; T0 O4 k; tEnd Sub
1 x8 V) A( A; W9 }Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
7 Z' y! M" B" u' N$ C! d8 P, fMyBase.Load
[* n3 ] l3 ~9 ]RetainScrollPosition()
, ?$ D$ E: [/ _2 iEnd Sub . B8 v; m# z7 K. T* e9 _
2 I$ @/ `8 g3 S$ i! ~4 @
3. DataList使用不同风格的模板) _# b# C, A# S# }8 o9 D0 \9 q
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条# H5 b) q0 J0 u& Z$ F
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个) {" b: f0 ~# \+ m0 W" K9 G
元素或是加一个促销广告图等等。* u- G6 h8 x& i0 B( n' l% Z3 @. a
Dim theme As String
$ `" E' o% \9 L2 G( S# q0 otheme = DropDownList1.SelectedValue+ P$ D& ^4 V: [$ l. j- l2 W: \
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
* X. {- b' D0 J! m7 ^8 _, V* I9 VDataList1.DataSource = DS
' x+ l: e: T/ A: d5 HDataList1.DataBind() # M' I& J( N; i) \
4. 设置服务器端控件的焦点( B. o7 c. A! Y7 t4 T5 Y* u
Private Sub SetFocus(ByVal controlToFocus As Control)! i5 E9 X& C9 n5 C) G+ z$ T' ?7 h
Dim scriptFunction As New StringBuilder! P( `/ k/ e- J0 s5 V& R2 f
Dim scriptClientId As String
) C- e" s' _" HscriptClientId = controlToFocus.ClientID
# I9 t2 Y. _1 @0 C5 X; tscriptFunction.Append("<script language='javascript'>"); b2 n1 h' o7 @. B2 V+ _* m
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
7 c5 T) O! w |- G& S6 |scriptFunction.Append("</script>")+ u* L! p& p; |: m% [
RegisterStartupScript("focus", scriptFunction.ToString()); u! o% G, q; Q" k9 ]$ L
End Sub) `: Y1 p# ^% s' ]
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 5 _, _' X2 _# {: }4 t* ?4 G& {
MyBase.Load3 \8 E0 }: H* \" }; q
If (Page.IsPostBack = False) Then0 y& g& b# K8 y+ @% V+ d! g
SetFocus(TextBox1)
& L5 `9 R- {) _! MEnd If5 U8 B8 b5 {3 \% `. z
End Sub
. R) I! H+ ^' u' O% E5 A) D; L w 5. 滚动DataGrid
) o4 y4 _6 n$ k* @6 k6 k 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
! t Y2 s( D1 p/ I: X有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
3 c: _5 x; _7 f- C- Y件放在一个DIV中将overflow属性设置成auto
C- S) N- [8 V# T<div style=“height:400px;width:200px;overflow:auto”>" o4 x' M- M% S3 y( [0 Y% j$ f
<asp:datagrid id=“MyGrid” runat=“server”/>/ o8 q# M; B O, L' i
</div> 3 i n* h) [* a6 ], b/ F6 _/ v
6. 动态创建控件& x5 a; Q( K+ S3 [, g, i, y
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。! K( ~$ O2 | l! A$ e8 q9 s8 P* S
Sub Page_Load()
, |8 u1 B; ?& P# c* Z1 X% ~Dim i as Integer
( f$ m" N% l2 b: W; _; oFor i=0 to 4
( D; Z2 k' h8 s. QDim myUserControl as Control
- L2 h, u+ y# C; t1 O- dmyUserControl = Page.LoadControl(“foo.ascx”)
- |. \1 @. r% D$ `% i! ]; APlaceHolder1.Controls.Add(myUserControl)
2 a# A6 W6 J' F v: G1 ]* O9 H' tPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))- ~& B# C/ H7 e9 Y5 a1 n3 m; }
Next i% _0 \. ^% `. h( u/ H+ j
End Sub / `- o& e1 m# L. O0 e" Y
7. 客户端代码的使用
/ {4 T6 i1 L" W7 o" w" v- ]- | 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
# m1 x9 I& a+ |准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
. A, ?5 W2 J5 n4 D) w" g7 n: V9 ]8 wasp:ImageButton id=“foo” 0 ]- |5 X; A, K
ImageUrl=“start.jpg”4 R. f5 o6 a/ l% e# G7 Q1 Y) D7 g
onMouseOver=“rollover(this);”
q+ |; Y7 o4 EonMouseOut=“rollout(this)”/ t$ N2 ?' m3 n H; }5 r
rolloversrc=“myrollover.jpg”
6 w3 }' H$ B; m- \rolloutsrc=“myrollout.jpg”
3 Y8 M- _! S6 V% H& ?runat=“server”/>" N: V( H7 V3 j p5 c% g# w
<input type=Button onClick=“return clientHandler()”
/ J0 K7 l! O* y* ^8 EonServerClick=“Button1_Click” … /> 6 ?$ w% v1 a( ]3 Q2 [; i
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所( E9 c: j) v0 U+ R3 ~
有的客户端控件。7 B9 T" V. n2 X- r
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ; Y* E& G# A5 O* @9 d4 Y
MyBase.Load* p. c& N/ | X; o9 F# b W+ p5 d4 _
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")9 T. t5 o; _. v H% p( P
End Sub
/ D1 X! F& o* f 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|