广西经贸职业技术学院论坛

标题: [建站技术]七招制胜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! GDim saveScrollPosition As New StringBuilder0 Z1 o  @9 Q* Q4 A9 A8 b1 J4 Q1 t
Dim setScrollPosition As New StringBuilder
% P3 c. u' f- y# dRegisterHiddenField("__SCROLLPOS", "0")
: ^4 K+ B% ?. X  B8 p1 CsaveScrollPosition.Append("<script language='javascript'>")
4 g+ t6 n+ m( x  p4 V  jsaveScrollPosition.Append("function saveScrollPosition() {")
2 l3 v6 {! y6 ^: DsaveScrollPosition.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. XRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
6 ~+ p3 K2 `$ o# FIf (Page.IsPostBack = True) Then
! ^, U" \: y5 FsetScrollPosition.Append("<script language='javascript'>")$ b# T: l6 h8 f$ {# o5 H3 r# m& c
setScrollPosition.Append("function setScrollPosition() {")
4 ^+ \# D, Y6 m7 R4 a; esetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")! L8 Q% e, U6 a- u: i  i# H
setScrollPosition.Append("}")
: @- Q1 X$ U/ `( jsetScrollPosition.Append("document.body.onload=setScrollPosition;")
- G- R" ^! I: B; IsetScrollPosition.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& {& bRetainScrollPosition()
9 y* b% d0 E& |End Sub
5 J9 t: s- P, M5 R: u$ y
8 A3 b, @+ ~/ N, }5 r6 d3. 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.SelectedValue0 J) T7 n$ l( Y; Q" _4 `
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
. Q/ O1 {. \6 K6 p& h, G6 m6 lDataList1.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 \, PDim scriptClientId As String
$ l4 V1 w1 A+ K5 b, iscriptClientId = controlToFocus.ClientID1 l) A; Y( j. @  Y, Z# K
scriptFunction.Append("<script language='javascript'>")
+ i" _1 u# u' }; o% x: jscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
9 c  f8 w1 A: [- P4 ~+ C, gscriptFunction.Append("</script>")
! _. a# ~5 {% U: yRegisterStartupScript("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.Load1 ]- F. S  S4 h4 Y
If (Page.IsPostBack = False) Then
6 {" G9 X$ ~, K& X# {  E4 [: ISetFocus(TextBox1)- Z' K0 X/ ?7 N6 c+ `# D4 ?
End If8 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 GDim myUserControl as Control0 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 Qrunat=“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