飞翔无限fxwx.com广西经贸职业技术学院论坛

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需' j# K5 `% j8 i8 j& a
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。% a3 O& W4 D5 P' L
  1. ~ 的用法
/ L- h0 M' J0 U' w, y: g  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
7 U9 R: \( m) x; i+ ]5 d4 T  V" W8 I式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不) a; R( d3 `6 c4 b" |
同层次的两个目录的aspx文件分别引用时,问题就会出现了。. v' w/ u  G5 s( U" }: M& \
  ~/image/about.bmp
* m% g2 b# N( t是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更& `% t6 g  z# O1 P0 }
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
) N0 |" p6 S/ P# }) [/ n' q* v它。1 t$ _5 r: c! b
  2. 在刷新和提交页面后,保存你的页面滚动条的位置
1 P3 `* m5 a, q; A  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说/ P& o7 s$ Y2 o5 r
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
$ }7 n/ A& l/ A" R% w组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方; F& ^' R5 E- L& ]7 D% M
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3705 H: B8 t) h3 `
个控件又需要他选择一下? ) s  }- o+ K- P
  用下面的方法可以很快地确定和记住你提交前的位置。
7 C9 d) h  h- o: ]  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,& T; e3 U0 f5 r& u2 t
不过他使用了Web Behavior这意味着你需要使用一个.htc文件3 R' X3 }4 P* o. R' p9 G
Private Sub RetainScrollPosition()
& l) b+ L$ D# |# Q: dDim saveScrollPosition As New StringBuilder: I; {9 D2 I9 B$ a9 U
Dim setScrollPosition As New StringBuilder
) h2 Q1 i' s& ~$ v: uRegisterHiddenField("__SCROLLPOS", "0")" W2 D, `" |- F" d# f
saveScrollPosition.Append("<script language='javascript'>")
' Y% v. \; |/ m. K, w  v9 I. bsaveScrollPosition.Append("function saveScrollPosition() {")
# N" z- I, _/ [" `$ @1 lsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")0 y* Y+ _. N, I# b3 z
saveScrollPosition.Append("}")
% k" z! c+ E- B; j* j. lsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")/ |0 G" W& \5 Q6 A
saveScrollPosition.Append("</script>")/ y0 \2 o( }* K# _5 l0 y. x
RegisterStartupScript("saveScroll", saveScrollPosition.ToString()). U( M4 r9 n# B0 {/ v7 R
If (Page.IsPostBack = True) Then
2 m# V4 c& t  ?setScrollPosition.Append("<script language='javascript'>")
) N. ?+ @, q: E; t7 |setScrollPosition.Append("function setScrollPosition() {")
# N! d; @4 ]; k* WsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")+ l% ^  i* b9 B% v0 f5 X4 l$ c: w
setScrollPosition.Append("}")2 P# W+ U- n6 F; V4 ]+ [( O
setScrollPosition.Append("document.body.onload=setScrollPosition;")
5 [5 n1 a' @! g6 Y$ esetScrollPosition.Append("</script>")1 S2 \1 X7 e& b$ C# g0 ]6 p7 y/ R
RegisterStartupScript("setScroll", setScrollPosition.ToString())5 M" l& Z2 h8 a4 V. O
End If; d# N* S4 ~1 l  X$ J, X; B9 K
End Sub! ~$ A- d6 c( u  N
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
; A$ E2 ~# \2 oMyBase.Load5 K* H1 v7 E7 x7 |# A! x) _
RetainScrollPosition()+ K. Q) {4 U9 Z% O3 |
End Sub
* w% [9 h* t% }% f; n
) {; m( f5 a5 ~1 g7 ^, x5 ~3. DataList使用不同风格的模板; [8 E$ R6 Y  E% K, H7 h
  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
8 ]* }# q4 `( m* Z! n! f件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
5 p$ q: Z. X4 u4 x. W元素或是加一个促销广告图等等。
) s4 u0 h1 K3 u3 j/ nDim theme As String" a# y7 t8 L5 w7 J: ~8 P; N
theme = DropDownList1.SelectedValue
- i- V, d+ }1 l0 f4 O$ x+ hDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
" Y3 D  c, f1 {. w; e. _DataList1.DataSource = DS, j. Z; k( z6 r% T6 ^3 w& Z
DataList1.DataBind() % h$ c/ U; w7 K& n# }3 s
      4. 设置服务器端控件的焦点
- v% |* Z; I) {9 x" s+ NPrivate Sub SetFocus(ByVal controlToFocus As Control)$ N8 s' ^& F  X; L  J
Dim scriptFunction As New StringBuilder
7 a* m" i8 }+ O& }Dim scriptClientId As String1 ]+ Q8 B6 V  k- `0 \
scriptClientId = controlToFocus.ClientID3 I' D. L2 S4 E5 [( \6 d! R4 @
scriptFunction.Append("<script language='javascript'>")
( |. @3 @+ k0 ?2 K7 CscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")& i* Q: o" v7 G: q# M3 W
scriptFunction.Append("</script>")$ P# X2 }+ A# \: f9 E; j/ ^
RegisterStartupScript("focus", scriptFunction.ToString())& u6 j7 `2 s7 f8 r  g7 z
End Sub
4 d' e9 i/ Q' }; j$ qPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
; X1 b" q$ T7 f1 `# I! S9 F$ ?MyBase.Load
0 f4 Q; S4 \; V+ Q# R2 IIf (Page.IsPostBack = False) Then- Q7 e6 ?  w, j
SetFocus(TextBox1)
, A, E! Y5 @+ k% dEnd If0 ~8 a" ]) E. u3 k/ e9 G
End Sub . o9 m9 _( Y* C! |8 ?
  5. 滚动DataGrid& ?8 S! m4 `' w( D
  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
, K! i7 l' u& D( _% L3 @6 m8 f有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
0 b# ~, p* r8 _2 I+ k/ a: J件放在一个DIV中将overflow属性设置成auto. Y7 N3 j) s) s7 a6 ~
<div style=“height:400px;width:200px;overflow:auto”>/ V: m6 A  {8 k/ _1 G- v+ r
<asp:datagrid id=“MyGrid” runat=“server”/>
6 Q1 {* T& B$ _* `& q5 K( }- I</div>
2 a, r4 P2 E/ J: T  6. 动态创建控件
1 z0 [6 [. r- o1 ^& i( V8 l8 j  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
) ], ?+ W( N; y# \, U$ R) M6 y% X. d6 f7 jSub Page_Load()) f, d4 @7 D& j& s1 k" c
Dim i as Integer
# [9 ]$ W" M( U5 s" FFor i=0 to 4
& n8 l3 s3 d' f: y  ?3 _; y! j; n; `Dim myUserControl as Control" O: z2 {+ k+ z" b; r! a% Y
myUserControl = Page.LoadControl(“foo.ascx”)
8 X5 L2 x5 X& m* z0 _+ lPlaceHolder1.Controls.Add(myUserControl)% J% T2 [1 v# o+ v8 }5 J
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”)); ]3 [; t0 P1 B/ V# C
Next i
6 M$ y: a0 v3 FEnd Sub 5 n4 ?, @: E2 E' \
  7. 客户端代码的使用
9 r% _- z3 @: D  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
7 I+ M) H0 E# U2 J准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
  c. B: @/ P0 L- a( f  }9 |asp:ImageButton id=“foo”
# `" Q# D/ h; c3 ]8 aImageUrl=“start.jpg”: j4 y( y6 P0 T7 e5 D3 w0 T- r0 r4 C
onMouseOver=“rollover(this);” 6 g; ~. l$ d5 B3 L5 u% I! }; v
onMouseOut=“rollout(this)”. o. q# `; [' p+ ~1 C
rolloversrc=“myrollover.jpg”  {: \; T. {1 S# K( h" u
rolloutsrc=“myrollout.jpg”: W, b  e0 F6 \, y, d0 }
runat=“server”/>
1 m, |9 p! @% |5 {- D0 P<input type=Button onClick=“return clientHandler()” 0 V# M1 ]2 d) b: g
onServerClick=“Button1_Click” … /> , ^  A/ i; ~0 n$ E! |
  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
. O' H- ]: @/ h+ K* \" W, X有的客户端控件。/ u% E1 r  S' ~/ t% _7 L" W6 s- M
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles 3 p6 R$ l+ H8 Q9 {4 C  g
MyBase.Load$ W5 T; l8 L* w) G
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
9 b9 I* @) @3 H; mEnd Sub
' }0 U. \# L( I) X  }/ p  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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