广西经贸职业技术学院论坛
标题:
[建站技术]七招制胜ASP.NET应用程序开发
[打印本页]
作者:
月中水
时间:
2009-10-16 01:25
标题:
[建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
% |' { W. e/ |
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
0 i U% N8 a+ {( y+ N! Q3 a& r
1. ~ 的用法
; r1 X+ f% R/ J: w
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
& R3 {6 @$ ^5 D7 e9 j
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
' {% M) s4 u/ s1 L, x0 F
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
8 X$ t; R; n7 y$ t4 p
~/image/about.bmp
1 X) f3 G T1 q% d
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
7 K' u% U/ x$ P
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
3 P' G: R; i8 {; f( A$ e
它。
! j3 W& }* j. {, g
2. 在刷新和提交页面后,保存你的页面滚动条的位置
: e1 T; C" _& a1 B U: z
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
' {; w w# e% R- m3 a/ c- ]
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
" [0 j7 q' |- u
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
# ~' q) R' h7 f- Y2 _3 A
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
1 L* m/ B {$ ]4 D! c
个控件又需要他选择一下?
( j1 U5 H$ k3 ^
用下面的方法可以很快地确定和记住你提交前的位置。
0 U0 p6 O' X4 y2 p$ a, B; h
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
# m% f8 M* {. W
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
5 C5 q" S3 ]9 E
Private Sub RetainScrollPosition()
- Q+ x# K& I( x: Y6 r8 E! G
Dim saveScrollPosition As New StringBuilder
0 Z1 o @9 Q* Q4 A9 A8 b1 J4 Q1 t
Dim setScrollPosition As New StringBuilder
% P3 c. u' f- y# d
RegisterHiddenField("__SCROLLPOS", "0")
: ^4 K+ B% ?. X B8 p1 C
saveScrollPosition.Append("<script language='javascript'>")
4 g+ t6 n+ m( x p4 V j
saveScrollPosition.Append("function saveScrollPosition() {")
2 l3 v6 {! y6 ^: D
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
P8 m" B' p, t7 a4 }" _! N
saveScrollPosition.Append("}")
9 _2 |" |; l# [8 H+ g
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
9 p" J# p, T8 n2 z2 M4 s
saveScrollPosition.Append("</script>")
$ M- c+ y4 H1 [+ Q. X
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
6 ~+ p3 K2 `$ o# F
If (Page.IsPostBack = True) Then
! ^, U" \: y5 F
setScrollPosition.Append("<script language='javascript'>")
$ b# T: l6 h8 f$ {# o5 H3 r# m& c
setScrollPosition.Append("function setScrollPosition() {")
4 ^+ \# D, Y6 m7 R4 a; e
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
! L8 Q% e, U6 a- u: i i# H
setScrollPosition.Append("}")
: @- Q1 X$ U/ `( j
setScrollPosition.Append("document.body.onload=setScrollPosition;")
- G- R" ^! I: B; I
setScrollPosition.Append("</script>")
! Q" M U( y' I" |: G: ~* E/ _
RegisterStartupScript("setScroll", setScrollPosition.ToString())
, v, Q5 I7 R/ }# j, {8 X& ]
End If
/ K) p2 g: C8 I; C$ G
End Sub
' j; q& A$ v5 W0 [# v. [
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
+ [ d/ \( W" `
MyBase.Load
# E0 o x* o5 o3 Z# a& {& b
RetainScrollPosition()
9 y* b% d0 E& |
End Sub
5 J9 t: s- P, M5 R: u$ y
8 A3 b, @+ ~/ N, }5 r6 d
3. DataList使用不同风格的模板
5 I2 ^& Q/ l( S, @
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
/ ^% f3 A( a7 j4 D9 u/ O
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
- W% H+ s. t! r, @: a
元素或是加一个促销广告图等等。
' U- x6 d* J- S( @
Dim theme As String
, o3 h! x; M/ P1 I
theme = DropDownList1.SelectedValue
0 J) T7 n$ l( Y; Q" _4 `
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
. Q/ O1 {. \6 K6 p& h, G6 m6 l
DataList1.DataSource = DS
# m! U+ r: N4 ^( @ R: h
DataList1.DataBind()
3 B$ H( n) k& l. F- q' S0 H
4. 设置服务器端控件的焦点
4 p' B5 P" j: a5 W& b% z1 r7 ]
Private Sub SetFocus(ByVal controlToFocus As Control)
9 I; e3 X- Q: @2 l# J7 @/ `4 o, K
Dim scriptFunction As New StringBuilder
. ` p5 B! j7 K% K0 w8 \, P
Dim scriptClientId As String
$ l4 V1 w1 A+ K5 b, i
scriptClientId = controlToFocus.ClientID
1 l) A; Y( j. @ Y, Z# K
scriptFunction.Append("<script language='javascript'>")
+ i" _1 u# u' }; o% x: j
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
9 c f8 w1 A: [- P4 ~+ C, g
scriptFunction.Append("</script>")
! _. a# ~5 {% U: y
RegisterStartupScript("focus", scriptFunction.ToString())
# T/ G: ~% I) {& X4 t
End Sub
, p6 A+ P/ h3 H( q4 q* b" C: Z
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
; ?7 w7 e1 v. c9 u! `% z/ a
MyBase.Load
1 ]- F. S S4 h4 Y
If (Page.IsPostBack = False) Then
6 {" G9 X$ ~, K& X# { E4 [: I
SetFocus(TextBox1)
- Z' K0 X/ ?7 N6 c+ `# D4 ?
End If
8 d! I! x I0 l
End Sub
0 Z6 f! B: H2 B2 F8 Z6 G. d9 S
5. 滚动DataGrid
# Q. s ?6 x- H9 W
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
5 }) u4 j x1 l' p8 @, V& q) a& P
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
: \0 u7 @. v" x# m3 c
件放在一个DIV中将overflow属性设置成auto
, h! _. y9 g0 _3 Z% ]
<div style=“height:400px;width:200px;overflow:auto”>
% a- z. u8 s" a7 y6 C6 i
<asp:datagrid id=“MyGrid” runat=“server”/>
) n! [! M8 B3 n( R
</div>
+ e5 t' Z; s% i
6. 动态创建控件
5 W+ G6 s* b, B
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
9 I( w. K' y N- R) s: S. a
Sub Page_Load()
H4 \' ]% v8 o4 {$ o1 s! N7 @
Dim i as Integer
' f( `, H7 c: _
For i=0 to 4
8 M f# }8 i5 @5 _4 @. f4 G
Dim myUserControl as Control
0 F) e& [. }6 s r; m- }- c {
myUserControl = Page.LoadControl(“foo.ascx”)
) y r! r) Y+ [. X8 Y
PlaceHolder1.Controls.Add(myUserControl)
$ g/ _, l& e8 N+ O: L
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
' f5 S& q- y9 i4 y4 w9 s2 F
Next i
: s% i4 ~8 d) d; P) B- v8 \
End Sub
6 D7 n9 T0 j7 k7 o+ ?7 ]
7. 客户端代码的使用
( W6 |( l1 |2 @
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
1 g* ^3 A9 Q1 Q$ [6 R( Z
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
# \/ r9 Y& W. b7 O9 G- Q( L' b
asp:ImageButton id=“foo”
9 ?( l& C9 p/ T3 s' Z' H
ImageUrl=“start.jpg”
1 h& w( o- v9 n9 |! F) |
onMouseOver=“rollover(this);”
% \, S- d& q8 A3 Y$ j! ^
onMouseOut=“rollout(this)”
1 a% c' a" C- o# Z3 I
rolloversrc=“myrollover.jpg”
8 @$ N3 T+ x8 R) x: q
rolloutsrc=“myrollout.jpg”
" V3 x1 P7 H7 R" Y3 Q
runat=“server”/>
% d. F2 x6 t5 r5 h% M
<input type=Button onClick=“return clientHandler()”
# }" X4 [8 {3 v5 z# w4 f% u* @
onServerClick=“Button1_Click” … />
! W( T$ F) s: V1 n
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
- G) X/ k* P. e3 L
有的客户端控件。
8 i( l& O a, R" l
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
9 W% h0 e% F# V, n* R; V# A% W
MyBase.Load
2 r5 e8 d( s4 ?& C- T3 n- y4 e
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
1 S2 t6 O: l( i3 c2 S! T4 u
End Sub
. ^7 y: z9 z- L0 `+ j
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术
欢迎光临 广西经贸职业技术学院论坛 (http://gxjmbbs.com/)
Powered by Discuz! X3.2