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

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需/ G) |7 n' J* p' C: L* {) y
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。5 X; @' T8 r  a6 Z) A7 `  r
  1. ~ 的用法; V! T+ n8 O+ \/ r$ ]
  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方% D9 F+ Z* }* {: x( \
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不$ D. m8 [$ e* w
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
  s  v' Q0 S0 A  `- G# p  ~/image/about.bmp
% @+ V, p" G+ z, N1 f; S是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更5 L) Z7 Z+ ?8 v& {# E% c4 q; y
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览, N( |8 ?9 G# `) Z) ~0 J0 l% ?( O# r! P
它。, g% p+ o* f1 i2 y  \5 z3 `
  2. 在刷新和提交页面后,保存你的页面滚动条的位置$ ?& Z0 |/ F2 \9 r: m8 b* L
  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说2 t4 y  C- L  |0 i: }% ~6 \
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
6 G; \. _) N2 l: J( l& Z组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方, K* g. `4 v0 Y/ O
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
% i( `. n. b2 r: N0 l& W1 c个控件又需要他选择一下?
$ A. g  @/ x, H4 r! V( w9 m& o  用下面的方法可以很快地确定和记住你提交前的位置。
" Y5 t6 w9 a8 s- k" E, [; M  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,$ G9 h2 Q# d2 ?: d
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
2 \: {2 Q6 C' ?% ~Private Sub RetainScrollPosition()
& u* h" u. f. |) X1 ]Dim saveScrollPosition As New StringBuilder# s) O8 `# R3 w+ `$ j
Dim setScrollPosition As New StringBuilder3 I+ b) T( a9 O/ f0 C$ G  B
RegisterHiddenField("__SCROLLPOS", "0")
* r1 _1 M9 _9 X5 c/ AsaveScrollPosition.Append("<script language='javascript'>")
0 d! w2 M# O3 u8 |3 t( ^, DsaveScrollPosition.Append("function saveScrollPosition() {")0 s' C( k9 O/ W% [8 G+ O2 M
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")  X) C# F6 L1 p
saveScrollPosition.Append("}")
) W' A2 u& x: {7 o& o  y0 S3 r1 @saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")4 b' e- b7 H: C* T6 g; m% z, ?
saveScrollPosition.Append("</script>")
! O* V' E2 X4 F6 S- ^  lRegisterStartupScript("saveScroll", saveScrollPosition.ToString())9 s: {+ e$ t/ P2 c8 @, A' S: B. k
If (Page.IsPostBack = True) Then
. Z  S( [  [8 w1 ]% s5 gsetScrollPosition.Append("<script language='javascript'>")
- Q+ Y1 D; n5 ~! U  x& jsetScrollPosition.Append("function setScrollPosition() {")2 v' Q7 e0 C( w
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")+ ^8 N1 m2 E! G! U; [
setScrollPosition.Append("}")- i8 t# P5 e0 E- O
setScrollPosition.Append("document.body.onload=setScrollPosition;")& m; J' b2 ?  o0 G$ b8 z. ]
setScrollPosition.Append("</script>")
2 ^3 {* q9 n# k" f: C* wRegisterStartupScript("setScroll", setScrollPosition.ToString())
7 y& k5 }" P( A+ P* wEnd If" G1 o6 z' }# y0 ~9 P: U. _8 G9 A2 {
End Sub
, L3 B& Q! X9 Q2 UPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 1 U+ e6 M, d6 a8 P
MyBase.Load% _+ n, b5 B- m  X/ P- f- J6 `( u
RetainScrollPosition()
: u6 {) E3 M  ]) h+ I% WEnd Sub
5 A& s) `2 Q5 Z7 S) [
: f7 Q0 |, v5 Y8 k% Z2 e1 J& G3. DataList使用不同风格的模板! ^' k  {) O5 x  P! L6 ~3 y" C( x4 b
  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
- K+ O: H3 N" f: a6 a1 g件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个' N  J0 d0 `% d3 ~; \& B0 J
元素或是加一个促销广告图等等。
! P& u6 H  O8 c  o9 u1 EDim theme As String- _0 L" Y" v/ [: @+ v# x# Y, Y
theme = DropDownList1.SelectedValue2 K# {3 _* [$ o! C! V
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool0 c% {- ~6 l) x. M- D
DataList1.DataSource = DS7 v/ d& C+ m/ Q
DataList1.DataBind()
" `  d7 \" ?2 M1 e6 `      4. 设置服务器端控件的焦点! h' _6 }8 u; ^" ^4 ~- ?6 P
Private Sub SetFocus(ByVal controlToFocus As Control)
3 m9 I  J* o5 v$ M2 WDim scriptFunction As New StringBuilder3 @& C6 ~7 e1 F8 u1 o# k8 n
Dim scriptClientId As String  |% b2 A* Y, K9 `- |
scriptClientId = controlToFocus.ClientID
  J# R; h4 Q4 B& i$ c- X' pscriptFunction.Append("<script language='javascript'>")
- o) t# E9 G& jscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
4 L( @# O- q/ {3 [: H/ L1 ascriptFunction.Append("</script>")$ E7 l( ?1 F9 j7 o3 R! x3 {) b
RegisterStartupScript("focus", scriptFunction.ToString())# j5 [6 n7 Y% y* i1 C
End Sub
& P' ]; D. N! W; u" ^4 q$ `: M" bPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ( K" {* e/ T! Z
MyBase.Load. f) E6 S9 y# D, H0 }  r
If (Page.IsPostBack = False) Then0 J9 }# C5 n; `! ~
SetFocus(TextBox1)
' {% D9 D% s' {, uEnd If
) d. v( ?; h( r* y; i7 N  hEnd Sub * K3 B7 L% k% p5 {' W8 t6 @
  5. 滚动DataGrid' j; P5 d1 _0 G; ?/ ?
  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
. h% z: H' G1 P有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
$ M5 r: u, Q2 W! k# _7 k9 F件放在一个DIV中将overflow属性设置成auto
, r  x2 {* U5 Q" l<div style=“height:400px;width:200px;overflow:auto”>
; v7 ^, S: G* A$ S<asp:datagrid id=“MyGrid” runat=“server”/>
$ \, T* K) q& g. B1 ^  o</div>
0 k6 Z" w3 u2 P. p  L7 D6 a3 z/ W  6. 动态创建控件
; M0 U# ^6 V! A. B0 ~$ U4 l1 q8 E$ p8 F. }  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
$ x( Z" k: H" nSub Page_Load()4 m3 V/ M& Z  b9 d: E1 ?6 T1 Y
Dim i as Integer
+ _: v5 b% E( O" H; `8 P; _9 tFor i=0 to 4
& Z3 y$ }# h- B5 \/ W7 nDim myUserControl as Control
. q0 n: c' k5 V3 `myUserControl = Page.LoadControl(“foo.ascx”)
$ S) O) _( c  _- p% s) c; fPlaceHolder1.Controls.Add(myUserControl)
, t+ g" v" V, T1 {( i! APlaceHolder1.Controls.Add(New LiteralControl(“<br>”))9 M6 U+ S7 ?4 ]+ F2 n6 m
Next i
+ }3 c8 }, }3 T5 Q; {3 K1 r0 K- uEnd Sub 8 a4 \+ d+ @: {, p6 z) ?/ T
  7. 客户端代码的使用% H9 K7 @$ c9 y- p& S% j+ i5 e
  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标$ e1 W% Y/ t7 K
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
* m1 }5 y& Y5 ?" @2 z; p! rasp:ImageButton id=“foo”
9 \4 o) V) }; C1 e8 w7 vImageUrl=“start.jpg”0 A; k; o/ s: H$ W$ b2 ~% t
onMouseOver=“rollover(this);” ! R: H8 ~  t5 Z5 b
onMouseOut=“rollout(this)”
7 f+ l( v# Z3 C' R- x' o' prolloversrc=“myrollover.jpg”
2 q- E% D+ L- |: Irolloutsrc=“myrollout.jpg”
/ j) V" g1 Z( W7 e7 Q& c9 wrunat=“server”/>
: j: f# g* I" r7 a4 \<input type=Button onClick=“return clientHandler()”
* ?' X2 C0 o9 d4 M- X* X0 zonServerClick=“Button1_Click” … />
. z: Z3 `* ^' ~/ D* A% f+ z  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所2 ?  m3 W" O- H: Z7 J# U8 u* C
有的客户端控件。
. g. @1 M% |( N+ |# \$ p: L; J  mPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles 1 w. V' V1 d% M& |7 j1 \6 V3 K
MyBase.Load- ]* a% |8 Q4 T8 n+ {5 e! c( E
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")8 T: P; s; E1 F4 o9 l/ ?3 W
End Sub
$ F7 E8 @; |. G. r  e& P* o  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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