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

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
9 P1 r% T0 }6 n/ O+ X6 F求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。# I1 m. P8 E4 N+ o
  1. ~ 的用法
4 q! q7 o6 L' I" _/ a  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
* w. Y6 C0 f' F1 |$ _9 @* c) |式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不- H- b# h, V* W! i: C
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
- i% h1 F: _7 R  ~/image/about.bmp * l+ O( \+ ]0 H: S9 K2 r- c0 x% g
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
& Z4 c7 ^# I6 E9 F& h5 g+ s" i加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览, a; Q4 ?. Y4 q" f
它。
, U& U8 n* a' K' D/ i; R  2. 在刷新和提交页面后,保存你的页面滚动条的位置  Y4 S1 t+ e7 Z2 [3 ^, s5 }
  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说" F3 X  V- b" T2 J5 ?6 }8 f
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
) q" p# r  p8 J2 W) w组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方7 L- d$ j+ B, K; D2 ^. e; c
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
/ ~7 j+ l; t# o8 K( H" m# g% N个控件又需要他选择一下?
" u7 s/ Q, |! _) c1 L& o, I# O  用下面的方法可以很快地确定和记住你提交前的位置。
8 y6 S/ h3 a9 @. e  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
& Z5 V5 `5 K% N7 ?! S8 k/ h5 T/ u不过他使用了Web Behavior这意味着你需要使用一个.htc文件% L+ N% n  b7 Z& f3 K7 P- J
Private Sub RetainScrollPosition()( f" r& t- ^% a* F- j5 ]
Dim saveScrollPosition As New StringBuilder
% u2 a: S) l  ]& t0 ADim setScrollPosition As New StringBuilder
3 u( Z8 Z: a, p, j# PRegisterHiddenField("__SCROLLPOS", "0")2 l* v% f/ d& u9 I1 N
saveScrollPosition.Append("<script language='javascript'>")
7 a5 f, ^1 r2 E' c( xsaveScrollPosition.Append("function saveScrollPosition() {")7 H2 U+ D' H, }4 r" d/ ?
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
% _( X, p  z" n4 ^$ B* J4 qsaveScrollPosition.Append("}")
, d9 N6 ^& {8 isaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")8 ^& y' X8 f: S+ u  Y
saveScrollPosition.Append("</script>")
' p; D+ K" c+ ~8 B- Y1 S" QRegisterStartupScript("saveScroll", saveScrollPosition.ToString())  Z: W4 G$ H( D. H* \
If (Page.IsPostBack = True) Then
# t; i8 L( c7 ~2 e8 ~setScrollPosition.Append("<script language='javascript'>")" h4 j9 u' T% y8 @; _
setScrollPosition.Append("function setScrollPosition() {")2 ?) ~5 s8 U2 m4 ?
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")7 C2 D" d: @8 R
setScrollPosition.Append("}")! r  C  ^+ X6 L. m
setScrollPosition.Append("document.body.onload=setScrollPosition;")" X' Q: ~$ A3 z1 T2 |: b* h2 w! ]
setScrollPosition.Append("</script>")
+ V+ B. C6 w9 m# q4 ~RegisterStartupScript("setScroll", setScrollPosition.ToString())
4 o; Z: d+ d/ m/ S7 p" v- H" xEnd If2 m* S' r; d  o+ Q
End Sub9 w2 ^/ P4 v5 e" r/ Q3 _2 z
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 8 S* c0 H' T8 l! e. R, ]- F8 d$ F
MyBase.Load) Z* F5 s! \: |  B6 y7 D& Z6 L
RetainScrollPosition()
1 Q! H( i- Z) K/ Y4 S; mEnd Sub % P2 v: i/ S; h5 B2 F/ d
, X+ F& j/ J" P# k% u/ B
3. DataList使用不同风格的模板3 n( o* d8 I7 B  z  ?! q* w/ p
  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
9 D: s* X/ T4 m) Q, Z$ r) U件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
" k0 w* `. g/ a2 f3 A元素或是加一个促销广告图等等。( T4 l7 Q# ~$ J& K
Dim theme As String$ J9 M; ]3 m" @; _$ ]& e; Z
theme = DropDownList1.SelectedValue& y- r0 j: a0 |" m% o+ @) ~  Z. z
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
0 B& e# y( ^2 `: e1 e! IDataList1.DataSource = DS
. L- T9 z. `+ w* c8 V  j/ ~; O( oDataList1.DataBind()
( J9 h' L! ^1 m+ a      4. 设置服务器端控件的焦点! T  a- a( I4 I$ `/ c* H7 E
Private Sub SetFocus(ByVal controlToFocus As Control)
0 ]" L4 Q# h+ M3 p' o, Z% {Dim scriptFunction As New StringBuilder
% A( b8 n: ]* p; WDim scriptClientId As String1 t: K, M$ C* `& i
scriptClientId = controlToFocus.ClientID/ N4 e/ e: c% t+ l" {$ W
scriptFunction.Append("<script language='javascript'>")
9 k, q/ ^# p8 y* R+ XscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")3 X  O0 d3 z/ h; O+ R3 k, k
scriptFunction.Append("</script>")4 }, I5 W" ]" Q( y
RegisterStartupScript("focus", scriptFunction.ToString())
# a2 C: c8 L- F* z# Y* ~End Sub6 G# M  F% W3 s- v
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
8 _6 Y( a% \5 R$ k# P( z- @1 tMyBase.Load
2 N0 z9 a$ W4 p, U. [% QIf (Page.IsPostBack = False) Then
9 A8 a3 o1 `3 K! _SetFocus(TextBox1)4 z' {& s$ A& l: H
End If% B. U' ~$ A7 F( j# k
End Sub * L  G" s$ ]/ G3 ~4 y% U# T6 i
  5. 滚动DataGrid
8 ]- B# {$ h! T/ _, E1 Z. Q  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只3 g  r. X! L0 k5 X/ D
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
6 L' {8 l1 w2 `$ [) ?件放在一个DIV中将overflow属性设置成auto
- i9 k  T1 V9 f$ p$ o4 V4 g* ^6 V& M<div style=“height:400px;width:200px;overflow:auto”>
* X/ d. a! F% S$ k5 U! O7 R; z7 B<asp:datagrid id=“MyGrid” runat=“server”/>) {: _$ d# U6 P
</div>
' M% q0 W) f! i) x  B' c+ b  6. 动态创建控件9 L4 D7 t9 j$ r- A, a* k! t# f
  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。; Y- q8 p" T6 \8 n' S) |' C" T
Sub Page_Load()4 b. \8 q6 i3 q7 R' Q( y3 \3 p7 [. U
Dim i as Integer
! L: B; P  g: F6 \7 _5 NFor i=0 to 4 9 z# A: A4 t: V, @  G$ b
Dim myUserControl as Control
- I) @3 q9 T4 T" g* H  p- i# xmyUserControl = Page.LoadControl(“foo.ascx”)
  h* o" e7 E! U  _8 H& xPlaceHolder1.Controls.Add(myUserControl)( H% |) |8 f! ^3 t
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))$ y- }( A0 J9 i* U
Next i
5 I7 Y- [0 s" g' H% |( kEnd Sub
; d. L+ [9 g% S5 P5 `) f( t3 U7 J  7. 客户端代码的使用1 m! ~. y  y" t( m5 W5 k4 \
  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
% S9 k5 {( w2 Y' k6 B+ f0 f9 ?; C准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性+ t; a$ D0 @$ K9 Q+ `- `  R; l
asp:ImageButton id=“foo” 4 M0 _" x# M! a
ImageUrl=“start.jpg”, z; j$ N; O, a
onMouseOver=“rollover(this);”
. m2 U4 D2 u; [3 {3 ponMouseOut=“rollout(this)”0 V- z* ^' j: o2 e$ ?4 K6 G# d
rolloversrc=“myrollover.jpg”' H' Q7 C! p" \# b5 l
rolloutsrc=“myrollout.jpg”$ |* g) ]# k- t' E
runat=“server”/>- Y- \. }* g3 l6 l+ x( |
<input type=Button onClick=“return clientHandler()”
( @) U6 D2 E1 qonServerClick=“Button1_Click” … /> 6 ]! U1 t1 R. V
  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所+ w! m- o, Y: v, o, d
有的客户端控件。4 K. x5 P/ p1 i# a* \. X# a  t% y
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles 6 I% G8 Z0 E4 k& _2 l
MyBase.Load! r$ J0 p# a2 n! S3 ]0 T5 h3 b( m
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")2 Q; E; O- Q+ b) H3 E& K, P
End Sub
; i) {' b' F; @2 s3 v) U  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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