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

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
; a9 k) c5 ~! W: m* M求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。- t1 E& q$ k2 @9 N! A, D
  1. ~ 的用法
- Z5 B1 e! \" \! Q, B) r; V# H% Z  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
9 z, ]! b4 |9 f4 k. b: i# P2 R式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不0 P4 D  T4 |* ], A8 z4 u
同层次的两个目录的aspx文件分别引用时,问题就会出现了。1 o, f6 t% r5 A' a! x; y$ p4 a6 @
  ~/image/about.bmp 6 _! Z/ a( S! a% `+ ]
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
+ p/ t9 ~9 |& z7 e1 G$ V0 V加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
' @" Q$ V4 f: B, k8 W) S* a; ?它。
" R" c. z8 h% q  e  i/ ~  2. 在刷新和提交页面后,保存你的页面滚动条的位置4 _; D: @( N* A' O! r
  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说* M7 y4 J3 X) f4 U* e: Y
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸7 h% q' {5 V! H2 K1 S
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方4 F! I6 o! T$ l% b. x
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
% y9 r- O2 O! T  w% x个控件又需要他选择一下? 7 r7 X& @9 M; r1 i( X3 Q  ?$ [7 k+ T
  用下面的方法可以很快地确定和记住你提交前的位置。
9 r" z, E( j  E* b- {: R5 l  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
& ~" R/ j, _7 ]9 i' F% F+ F* V- G不过他使用了Web Behavior这意味着你需要使用一个.htc文件& |9 s9 s: N3 c7 N% m  K
Private Sub RetainScrollPosition()
3 c6 E7 j. H, {; \4 S1 x1 y# @Dim saveScrollPosition As New StringBuilder8 [: u5 i; K9 a; L( [
Dim setScrollPosition As New StringBuilder* U' ?! N! f, \7 G
RegisterHiddenField("__SCROLLPOS", "0")
0 ~( W- B, p' Q# ~saveScrollPosition.Append("<script language='javascript'>")3 @4 r; t& P3 [' k8 r' R0 ]! O
saveScrollPosition.Append("function saveScrollPosition() {")
  s8 ?2 c" ^1 Q; f* usaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")3 r! i$ w0 _, y. u/ M+ ]
saveScrollPosition.Append("}")" k* {0 c; i5 l1 u1 r; D
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")+ g$ V* U, h. @1 V
saveScrollPosition.Append("</script>")$ t8 T5 k( Z' @
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())' Z5 v6 e" }+ D0 O0 s
If (Page.IsPostBack = True) Then
9 R9 Z  G) m; u* t1 A+ TsetScrollPosition.Append("<script language='javascript'>")8 c' E1 Y. u* Y8 P, l7 \
setScrollPosition.Append("function setScrollPosition() {")
# G, y9 h& v& y/ i& F! ~* DsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
! I0 F3 H3 H* v: k8 h' F& A* KsetScrollPosition.Append("}"). R0 d5 o: J9 j( Y* y
setScrollPosition.Append("document.body.onload=setScrollPosition;")0 ]  ^# O5 M" e/ v/ s
setScrollPosition.Append("</script>")3 r: g4 r, _  u
RegisterStartupScript("setScroll", setScrollPosition.ToString())3 @) D, q; Z% D  P
End If$ Z  k2 @* b+ a2 D0 Z
End Sub
) R+ f+ w+ X" k/ X$ [# f2 APrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ! T1 E. p1 |6 [9 ^" `" X
MyBase.Load
( s# o6 x6 i7 e0 C7 SRetainScrollPosition()5 D( F) {# l+ G9 U( V: C
End Sub 0 t! C7 T5 @- b- Q6 Q
$ f! k) e: y4 v
3. DataList使用不同风格的模板
! [8 h+ D0 N% X! f: P* Z  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条# [2 H1 c) F# Q! f! T
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个2 K( V1 B, B  O( a, R! _: @2 B6 u3 d
元素或是加一个促销广告图等等。
. x6 x$ k. g  r; z4 rDim theme As String
6 y% B. A0 W7 A  c0 Stheme = DropDownList1.SelectedValue
) B9 c8 R9 y$ c* U) {! g7 ~, x* X2 X% j, gDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool2 Y; A* g9 r0 B5 x$ j
DataList1.DataSource = DS! D# Z7 s& R+ b1 a6 }& [- e
DataList1.DataBind() # F2 M  Y5 y0 V5 }& {
      4. 设置服务器端控件的焦点& k# g/ i, d/ h1 X
Private Sub SetFocus(ByVal controlToFocus As Control)
) \! h& a" x, B& E5 Z( MDim scriptFunction As New StringBuilder
* l. m2 x0 f0 s# @Dim scriptClientId As String
* `% f2 R; @7 x3 _1 l% WscriptClientId = controlToFocus.ClientID8 J, r* w$ [* j5 K0 @7 @" K2 J9 S
scriptFunction.Append("<script language='javascript'>")1 S9 m  M3 {0 C! G/ H3 `, ?! b6 @" ]4 |
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")9 p0 B. Q3 x- e4 ]5 r0 L8 P& ^
scriptFunction.Append("</script>"), N! n9 ^3 I2 M; [% g7 t; @
RegisterStartupScript("focus", scriptFunction.ToString())
2 p; ]8 F4 I/ lEnd Sub, Q# j  \; H2 D1 ~% @
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles : m; v  x9 _' u" d2 o
MyBase.Load
9 J0 e% H0 C. R- SIf (Page.IsPostBack = False) Then
& ^: y. ?0 E6 d1 x) r9 @5 i$ [SetFocus(TextBox1)
' R- @5 X' F- F+ I# w: e3 p6 HEnd If
0 k0 C& i3 j$ nEnd Sub 6 W+ a' y4 g- j9 c
  5. 滚动DataGrid! f5 G- ]; K% w6 a1 e4 }
  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只3 J2 D( u2 j( x8 S
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控; H1 V$ O" C! k/ j+ _
件放在一个DIV中将overflow属性设置成auto7 Q9 x# g0 ~- F; G# R
<div style=“height:400px;width:200px;overflow:auto”>. t, @' c( [3 t2 _
<asp:datagrid id=“MyGrid” runat=“server”/>( f; ^: _; u& U6 U
</div>
5 O8 Y: p+ o" U" K+ G& s/ K  6. 动态创建控件
$ g2 [+ o0 w5 D) ?. F, J" f  X4 k  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
! i' ?, _& ^) g+ e/ j- w$ H8 NSub Page_Load()
! w. |8 |. c6 nDim i as Integer
( L3 ^8 s2 c2 Z5 ~7 w. `For i=0 to 4
: Q8 F; b( \& C( IDim myUserControl as Control
6 Q( R% f; h! z6 I2 Y: {myUserControl = Page.LoadControl(“foo.ascx”)
4 G8 w, @  }* l7 lPlaceHolder1.Controls.Add(myUserControl)
* ~5 M$ q* I7 \2 V9 uPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))3 }  D0 w) B. u4 @) K# J
Next i: O! G- D5 `* p' n+ S! j1 g
End Sub " H6 \- n- k7 y8 s' P% U
  7. 客户端代码的使用/ T' B( R! s+ a" q# a1 {4 i7 F
  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标2 D4 ?/ F$ K2 w9 l! r
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性5 l/ C' |' r& n: T" P' x
asp:ImageButton id=“foo” * \' T$ ^: `6 V1 g+ \
ImageUrl=“start.jpg”
0 e. J" \$ p4 m; v# `onMouseOver=“rollover(this);”
+ \  y% @8 D' _) q# RonMouseOut=“rollout(this)”2 m- {% x. O" r
rolloversrc=“myrollover.jpg”6 U- E& N  @8 t2 q
rolloutsrc=“myrollout.jpg”
$ d6 A$ P* ]1 K  Z7 G. W$ F$ |runat=“server”/>
- ?3 c% q6 {* Z& y<input type=Button onClick=“return clientHandler()” ; u8 @& Z& L4 v: S  U
onServerClick=“Button1_Click” … />
; l6 p; f  O; a& f  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所% c' ^- `; f! z0 q4 s
有的客户端控件。
- h8 T' O: ]4 t7 o% yPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles
! X! y, @: h+ v. }% ]MyBase.Load
$ [2 y9 l* k& J" D% Z# p% E9 p* ~ RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")2 X" {' L; O- m, Z; {. h* r& u
End Sub 0 d9 g; F5 ~3 c! E
  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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