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

标题: [建站技术]七招制胜ASP.NET应用程序开发 [打印本页]

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需8 H: ?* L! m; O4 T& N' w0 w
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。3 t0 V' ]* V% w6 q
  1. ~ 的用法
  |3 b/ l7 ~9 y! n' J# ]7 o  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
; b' v8 x  }; L( F+ }# R' i式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
2 h& j& d& O6 X2 h4 ?8 ?同层次的两个目录的aspx文件分别引用时,问题就会出现了。( _) O, I0 h3 y! ~$ Z+ ]% L
  ~/image/about.bmp
8 @# Y! s7 k5 d1 A+ w. d8 Q是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更( N) Z$ a' |+ O
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
. ~5 E8 |4 E, D3 F! R1 L它。6 G. I; U) v/ E4 b* D' s) U: j
  2. 在刷新和提交页面后,保存你的页面滚动条的位置9 n& }- T# K1 t: k4 S9 }
  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
) S6 H) B3 a/ W& [+ S) m8 A% e5 ], _用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
0 m% u- B: ^+ {1 _3 [- J3 q组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方; B& R9 G, P$ M
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370, I7 z: R( K% n5 |- Q# _# p
个控件又需要他选择一下? & M( U7 y& _5 R  ]+ g
  用下面的方法可以很快地确定和记住你提交前的位置。+ {5 j5 @+ r8 V# Q
  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,/ x# `; W. z7 J" z
不过他使用了Web Behavior这意味着你需要使用一个.htc文件5 X, z# X$ a8 l! D  x% F
Private Sub RetainScrollPosition()
0 k' Q- V" C6 h  f7 UDim saveScrollPosition As New StringBuilder( @7 v1 p4 g  a/ Z
Dim setScrollPosition As New StringBuilder+ O1 r1 I$ H; g4 H3 _6 ]6 b
RegisterHiddenField("__SCROLLPOS", "0")
. M* A, ?2 t# {saveScrollPosition.Append("<script language='javascript'>")9 ^9 }, U3 i7 ^. ]9 _8 v  X" A  p% P
saveScrollPosition.Append("function saveScrollPosition() {")1 p7 G. }; |$ [' K( H  v
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
7 A& I/ a0 a9 {# u7 {saveScrollPosition.Append("}")
- }4 l# V4 k9 LsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
$ q# K7 |: V/ A( i5 T6 A8 @) isaveScrollPosition.Append("</script>")9 o6 K& `. b( r% Y2 X
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
& a% z& l$ n' s7 q- SIf (Page.IsPostBack = True) Then
) B3 v5 v$ r$ H- a6 ~1 DsetScrollPosition.Append("<script language='javascript'>")
/ u( l- _; y, S+ d! LsetScrollPosition.Append("function setScrollPosition() {")2 I. u6 ?- H& v6 l
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")2 W5 K) _: u  o9 h7 t1 W8 C& h! ~
setScrollPosition.Append("}")
0 V3 H  e1 l) a  qsetScrollPosition.Append("document.body.onload=setScrollPosition;")& W( d" y6 A2 N
setScrollPosition.Append("</script>")5 L9 A3 a8 [* `$ p* }" u2 R2 v
RegisterStartupScript("setScroll", setScrollPosition.ToString())
9 K* E, e& x" j. ?End If
0 q8 n- U& i( w! k: s2 O; p- IEnd Sub
2 V5 |7 L  D9 dPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 8 [' }7 n, |! G8 c6 N5 x1 f. I, }4 W
MyBase.Load# \8 t1 \: T- l5 [+ D% X- q
RetainScrollPosition()
; @9 g) n" ~- M: C4 d4 N# `/ A. FEnd Sub * |* P0 ^7 X/ R! O) U
5 l0 Y! p5 f( x
3. DataList使用不同风格的模板
- h/ U; Y( u+ ]( v  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
% ~+ c7 j4 G' Q7 J0 s! U件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
) X* Y) d6 D4 @# K! W* p+ Z元素或是加一个促销广告图等等。$ M. e5 ^9 y, x- N$ X
Dim theme As String+ o) N. N0 c' p& T: T) l
theme = DropDownList1.SelectedValue- z' O* n( D3 m- H# R4 Y# i1 ]
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool& u  Z3 y# g; h" v+ D/ z2 v
DataList1.DataSource = DS$ ?- B# j: D1 e- ^% O. l. P- {- m
DataList1.DataBind()
0 S2 ]3 x, H9 g+ T" N1 O      4. 设置服务器端控件的焦点1 `3 ?# @0 `# F
Private Sub SetFocus(ByVal controlToFocus As Control)" R% Z3 b" Z( t6 z
Dim scriptFunction As New StringBuilder
" B& [+ t" w) l+ T; r/ IDim scriptClientId As String
+ l+ y; v" [& f" mscriptClientId = controlToFocus.ClientID
5 p7 S8 ~, ~1 s- d& B2 lscriptFunction.Append("<script language='javascript'>")$ M: `6 h$ V# m! w6 E& Z& C! Z
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")4 p. G! ]8 g0 y7 ~$ h
scriptFunction.Append("</script>")
) ^" Z' i! M9 M' [* o8 aRegisterStartupScript("focus", scriptFunction.ToString())
9 ^% |4 h& _5 }! G! m* U# pEnd Sub, F& o2 ^# l! e' c( W& S
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
( K. W) M: \6 h, PMyBase.Load
* o9 i! O! a9 {& A9 R6 VIf (Page.IsPostBack = False) Then
! Q/ b6 [  R7 L* w- USetFocus(TextBox1)
5 r" q$ Z4 }7 k. c+ zEnd If
5 ^2 z5 i$ U9 g) ^' A; oEnd Sub
4 a. v! |& ~0 P0 J- d  5. 滚动DataGrid8 W' ]( L- j; r8 u  r
  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
4 {( n. n+ e2 i3 w: Q2 z有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
" Q4 T# B& ]# \( I件放在一个DIV中将overflow属性设置成auto
( _7 s0 l5 ]8 p2 u5 d<div style=“height:400px;width:200px;overflow:auto”>
/ C8 ^0 y; b, O9 u( b' }2 W<asp:datagrid id=“MyGrid” runat=“server”/>
) H* \# l. C% G$ ]0 C% l) h, M</div> & V: O. n  }, A+ m
  6. 动态创建控件/ H6 ~% Q) [1 ?5 D" y& p. _
  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。% W9 F7 W2 ~+ ?* N& u$ H
Sub Page_Load()6 ^' C" u4 L5 y
Dim i as Integer& O4 T/ ^5 W6 K) R3 y- S- b2 V& ?
For i=0 to 4
1 x4 L0 b$ F6 H& G+ WDim myUserControl as Control
( ^6 f: T' B/ dmyUserControl = Page.LoadControl(“foo.ascx”)
7 L- ?" \4 Q8 V' I& `4 PPlaceHolder1.Controls.Add(myUserControl)
  Q8 E5 R$ x4 N! N9 s' OPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
. E4 Z& p1 z+ Y! l3 h7 c+ MNext i: p5 o6 t" U0 W9 |! ^" r2 S4 t
End Sub 2 Z& s7 Q2 F) |4 v: m
  7. 客户端代码的使用
; S6 y1 H) S4 E/ Q/ W$ J  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标4 Y; d% a0 N) x: G; \* I: \
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
$ T( A, i% K1 m5 O1 T4 C, qasp:ImageButton id=“foo” 0 g- D/ ^% r: m
ImageUrl=“start.jpg”9 T/ T  G+ S, a5 z/ {% s9 A
onMouseOver=“rollover(this);” ( L4 F, Y/ ~6 G1 u% ?# _5 [
onMouseOut=“rollout(this)”9 g1 x, m% H) @- F% B' @; l1 n0 s
rolloversrc=“myrollover.jpg”/ z% ?/ P0 V, R4 E
rolloutsrc=“myrollout.jpg”! I4 f  S- \8 ~
runat=“server”/>3 A$ V/ c- `1 b3 ?) b  r8 v: G
<input type=Button onClick=“return clientHandler()” % n- y$ |; r6 p* x! C1 O' h
onServerClick=“Button1_Click” … /> 8 q9 o9 X/ v$ m) Z5 m# z/ G
  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
3 d, q  P. \- D, S- u+ j& ?有的客户端控件。
0 {9 `. R( l! x  XPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles ) q' J- G8 `: j/ E
MyBase.Load
; w  i  d4 _7 Y9 h RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
# Y( d, l& J' C/ G2 ~End Sub ( y. ~% @" ~: g% N! G; R
  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




欢迎光临 广西经贸职业技术学院论坛 (http://gxjmbbs.com/) Powered by Discuz! X3.2