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

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
9 Z6 E. G( m+ U- I求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
- \7 C7 F7 K: c# N  J! S# t  F% W& Y  1. ~ 的用法
, @& ~. G* x* t2 P  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
0 W; u6 h- q8 J) z) Y/ m: H式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
- k6 S1 w5 m7 _. O/ n同层次的两个目录的aspx文件分别引用时,问题就会出现了。
; k+ H, g5 R: |  ~/image/about.bmp , k9 E+ w6 _. r  o( L! k
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
8 A- N7 Z* `9 k2 {& ^加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
! m& |/ m3 X* E/ o& o; _它。
' q% d1 q. S, K  w) x" u* W  2. 在刷新和提交页面后,保存你的页面滚动条的位置
2 `: j+ r/ T2 q6 n( r  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
/ D' l, p1 C- H! V/ w4 |9 p" ]用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸+ o) A+ p1 u+ M5 Q& c
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方8 u  w' @# T, X8 U/ c
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370. ^) O1 X. g) N
个控件又需要他选择一下? 8 t1 a6 @* M* n
  用下面的方法可以很快地确定和记住你提交前的位置。
- O- ?2 U& G. Z  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
. S/ ~, P5 `2 n' [不过他使用了Web Behavior这意味着你需要使用一个.htc文件2 \& W# X$ \& j3 ?& C4 H$ X: m
Private Sub RetainScrollPosition()
+ {$ w# _3 {9 }  n3 l, }0 \Dim saveScrollPosition As New StringBuilder; k4 g- j# T; n- y! O# b! H6 ]
Dim setScrollPosition As New StringBuilder' B- \, S% ~9 e/ o
RegisterHiddenField("__SCROLLPOS", "0")9 c! n" ?9 q4 c) b0 k# Y) A4 N
saveScrollPosition.Append("<script language='javascript'>")
; |( A7 f5 Y/ J0 S# ssaveScrollPosition.Append("function saveScrollPosition() {")
6 Z  R1 h( Z+ Q2 \4 U& P) M0 ?! |saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")$ p2 h5 ~$ A5 V; {9 B; d
saveScrollPosition.Append("}")
; |" i0 ]/ A8 a( M0 OsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")8 k7 c, N5 q0 @. i
saveScrollPosition.Append("</script>")3 Y- X  h$ O: V8 A( j8 q
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
6 U9 O9 Q/ O8 E$ U; N$ EIf (Page.IsPostBack = True) Then/ t6 l# j" I* _! W5 Z
setScrollPosition.Append("<script language='javascript'>"), y. Z: G) ?$ V- t' K' f8 U
setScrollPosition.Append("function setScrollPosition() {")
) j- a5 h8 v, f; \9 A0 j0 AsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
- O- b- g1 |0 I% ~; ksetScrollPosition.Append("}")
8 m9 X- @7 e& S! ^setScrollPosition.Append("document.body.onload=setScrollPosition;")
$ O" F# Z5 P( q5 lsetScrollPosition.Append("</script>")
; ^/ n2 W- K/ i! y$ K' ORegisterStartupScript("setScroll", setScrollPosition.ToString())% i; Z( B' m1 B! B+ ~5 A2 R
End If4 s- N' ]! w' B0 k
End Sub% j* q8 C. N9 l; _
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles - U+ E; h6 y' F/ `' i1 Z* V
MyBase.Load, }( j9 q! r7 d6 w1 P
RetainScrollPosition()# B/ ~8 F- j# s% z0 ?
End Sub
$ C: o; P1 ?' G" w3 N$ l' p2 H
* _' Q! W9 o3 |9 M, O8 T3. DataList使用不同风格的模板
8 W0 s8 {5 s& @- }5 }; J6 \  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
5 k$ j. I! u. }0 {! f' V' A件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个( s4 g2 N0 u! }5 x
元素或是加一个促销广告图等等。' u* L. ?1 G# [4 L! T
Dim theme As String4 L. U$ ~: E) ~
theme = DropDownList1.SelectedValue' H! X/ K$ _9 Z/ E6 G* U8 v
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
4 U" i# a6 q  u" X. C, c2 g1 x& CDataList1.DataSource = DS
$ S9 {) W8 \0 F. i/ l5 e$ q, P/ ODataList1.DataBind() + K- k; {; I% b0 g5 I: V
      4. 设置服务器端控件的焦点9 R: B# U9 f) J; N% j
Private Sub SetFocus(ByVal controlToFocus As Control), J2 Y; [$ A9 @. `9 T9 W4 Y
Dim scriptFunction As New StringBuilder" G* Z6 P$ I( G* w
Dim scriptClientId As String- n3 @$ X6 m7 N3 u  c/ f
scriptClientId = controlToFocus.ClientID* B5 L3 j4 s' r0 a
scriptFunction.Append("<script language='javascript'>")
5 F# g8 ]0 S0 ]2 QscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")4 k, F5 P  p3 Z% G! |! G
scriptFunction.Append("</script>")
+ n' L7 r  }6 u) ?( `) cRegisterStartupScript("focus", scriptFunction.ToString())
  {0 p, D% `/ S7 p3 P  s& GEnd Sub
- X+ f2 |6 u. k# ^# }Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
# ]/ |) X1 r. b& f9 j! LMyBase.Load+ L1 s% Z# p+ W$ \
If (Page.IsPostBack = False) Then6 T2 u$ ?3 A" S: t* S
SetFocus(TextBox1)1 u' F$ |0 j  q5 u7 |2 ?
End If8 B* b5 T7 {7 m% T' f
End Sub . M# s7 H7 B; B- q# s
  5. 滚动DataGrid
( R  p! t2 l8 s4 v8 J  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只* x" J" H% D" ^( n3 J6 |, [% }) L: |
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控2 ~# S: y. P, W8 s! i
件放在一个DIV中将overflow属性设置成auto: K- r% ?3 @* O! h7 s1 K
<div style=“height:400px;width:200px;overflow:auto”>2 ~" [2 k! c4 x+ {) }6 v
<asp:datagrid id=“MyGrid” runat=“server”/>5 d2 y8 H  M( J5 K: ~1 Y
</div> 6 W6 ~* p# \1 B; _4 P
  6. 动态创建控件: `1 G+ L# `' a. |
  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
. k7 S" c$ P& @6 d7 FSub Page_Load()
$ J) z% X# x5 v8 f7 G. [" p/ lDim i as Integer
2 S7 Z) F& H! i3 H& R6 N  x/ |6 QFor i=0 to 4 # G& ~; Y/ H; x# e. x
Dim myUserControl as Control! @, F& V# p: p( q" J+ M2 }
myUserControl = Page.LoadControl(“foo.ascx”)
4 |: g* L% S5 X5 ~* I; RPlaceHolder1.Controls.Add(myUserControl)4 `* g. [! _! z. T6 j( W  c3 P$ I
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
# u  D/ C8 y7 y3 G) \Next i8 l( F/ C9 D4 u, e
End Sub
; L* p9 Q+ h% `' k  7. 客户端代码的使用
& C( B( J# {& U" i; o  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标' g2 z) F- g' F2 a+ }# ~) s4 L6 L
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
/ M% ?3 z- R+ i: L1 ^asp:ImageButton id=“foo”
0 k" ~5 K5 A& H7 RImageUrl=“start.jpg”
# M6 ^4 n: V5 G- G/ ~& }% n! WonMouseOver=“rollover(this);”
. N" m6 ?: {9 P' A& l& }/ XonMouseOut=“rollout(this)”- S- X8 @4 u& D7 ^, o
rolloversrc=“myrollover.jpg”
( U3 `9 r) e& z. N/ V% P8 q% T( I" trolloutsrc=“myrollout.jpg”
6 I. R3 \' G" m. h. Drunat=“server”/>
$ l  \9 z, d8 o- K6 E) K" m9 I<input type=Button onClick=“return clientHandler()” - Y+ e+ Y/ o$ }  [0 Q& N  R* |
onServerClick=“Button1_Click” … />
( c& O$ Q4 V" w- n  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
8 T* W/ M0 H/ b8 r- p: Q' ]有的客户端控件。$ G- o" S' p# K" W9 n$ m+ J
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles
1 V. Q* H1 R6 D4 |- J. u* k5 O5 dMyBase.Load. U! J6 b6 r, G& R
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
5 j: ]/ Q  }  `0 p  n7 _; K# \End Sub 9 s  U5 p; m& B% |0 z1 ?' p
  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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