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

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
8 B, r- l6 l5 }! \2 a求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
) s6 Y5 f9 o4 J" v" ?' V$ `" v  1. ~ 的用法% e) W$ V; M9 u! d2 ~! i' v
  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方! c. o( v7 Q( r+ f: u$ V. ~
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
( v% X$ E! S# S4 s) h同层次的两个目录的aspx文件分别引用时,问题就会出现了。
- U9 [6 m: `" l2 i, h  ~/image/about.bmp
/ `* A; |/ ?9 h6 Q是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更7 @& r* M5 r: E0 `- o7 q
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览8 l6 n, |# R+ M4 n  I, C
它。
  m/ a) f( l) e' O  2. 在刷新和提交页面后,保存你的页面滚动条的位置
2 `( ]4 }) y+ J1 l& `$ X  X  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说% d! l' e4 X- j: Z8 U3 x5 S5 c
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸4 r' g: O6 S7 [% J# Z
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
$ |" {9 Y; J8 ]( U也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370+ @) l8 H) J  \- x% m
个控件又需要他选择一下?
) @1 F+ [; U. A4 l8 q& c  用下面的方法可以很快地确定和记住你提交前的位置。+ F5 ~% G8 _0 |- V. T
  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,9 n1 X- h$ m3 E4 w" I
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
9 u$ K" X$ D  c7 |Private Sub RetainScrollPosition(), I8 X0 f5 @. f2 \
Dim saveScrollPosition As New StringBuilder
9 |" ~% X3 M- p1 uDim setScrollPosition As New StringBuilder
2 M& n7 U' ~/ a/ q0 F" MRegisterHiddenField("__SCROLLPOS", "0")% Y5 E4 c! G7 D# J" r
saveScrollPosition.Append("<script language='javascript'>")$ Q8 W9 B5 |- \" y# n* P* T
saveScrollPosition.Append("function saveScrollPosition() {")/ m) I. b# x0 ~
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")% [* _8 k7 ]* ~) E  e8 v) Y
saveScrollPosition.Append("}")
' S3 p; S2 a3 H2 ^  RsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")# S5 y. R4 I; O6 ^8 M: H
saveScrollPosition.Append("</script>")
- c! r7 P; V3 f& A3 [RegisterStartupScript("saveScroll", saveScrollPosition.ToString()), ~/ ]1 c1 ]& s/ r
If (Page.IsPostBack = True) Then
' f. G1 c0 M& E% @! B1 [3 h5 c4 n6 bsetScrollPosition.Append("<script language='javascript'>")
: d- J  |7 s9 R/ ksetScrollPosition.Append("function setScrollPosition() {")0 O! g1 G, G! h
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")4 ?3 U+ \# f8 S! l' z9 r
setScrollPosition.Append("}")
8 }! k+ @$ Q! o/ i2 d$ }) B/ N2 YsetScrollPosition.Append("document.body.onload=setScrollPosition;")
. z7 n- |5 E& c6 v3 MsetScrollPosition.Append("</script>")
+ o  Y1 d  r7 N* ]/ k- m6 @7 gRegisterStartupScript("setScroll", setScrollPosition.ToString())
: e! p- `9 a+ A5 J7 e! nEnd If! \$ F4 A  H: R- c
End Sub
6 b  T# J3 y$ l2 k# Q: @* APrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
8 ]1 m" D8 ?. @0 TMyBase.Load
6 p: e4 d* l" F( p" o- K: s6 QRetainScrollPosition()7 t; ?$ z7 L* s* n  g; c* f- I9 H0 ]
End Sub
+ E. H6 N4 @9 p( B7 G- [  F
+ C  a* B2 M: ^) ]; g3 e! `3 q3. DataList使用不同风格的模板3 F7 P- N+ b" a$ G& I, J9 b
  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条& G5 w! j2 K% m, g1 o
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
+ G- q8 h) @- `' H* C元素或是加一个促销广告图等等。' `- d3 j8 X7 _* l4 F' L: s# Q5 ]& M
Dim theme As String4 y0 L2 _5 s. k. E( T
theme = DropDownList1.SelectedValue
1 o, U& Y# }( E( c' wDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
# R; r. l5 w& j" A8 o5 z: }DataList1.DataSource = DS
( E' ^+ @0 A9 Y" s% \/ v4 B; A$ {5 lDataList1.DataBind()
$ j# p1 ?9 |* M+ O2 y3 ?      4. 设置服务器端控件的焦点
; L+ u1 F( ?/ d* V1 ]Private Sub SetFocus(ByVal controlToFocus As Control)" `: R: b7 n+ U2 h
Dim scriptFunction As New StringBuilder5 @& }" r$ l6 y; c+ {+ ]. \5 Y
Dim scriptClientId As String" t7 n: N3 ~, w' C1 q" x
scriptClientId = controlToFocus.ClientID' a+ w, d0 c2 g( K
scriptFunction.Append("<script language='javascript'>")8 O6 l9 }% e6 a5 ]; s0 L5 g
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")6 Q; G2 U6 T7 G+ ]- E3 `
scriptFunction.Append("</script>")" T5 J0 o+ ~0 X) r6 {' L
RegisterStartupScript("focus", scriptFunction.ToString())' e( O" v+ E% J
End Sub' ]9 s/ E$ P2 _# f& D0 ?
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
" o5 z* Z) A8 X2 y0 ?MyBase.Load
; I7 B% {6 n% k  JIf (Page.IsPostBack = False) Then
  o3 u: J1 y* O! j! x& bSetFocus(TextBox1)
# y/ d6 O+ E: I' a$ N3 mEnd If
7 s4 M* w3 P% V( |7 n7 H0 {End Sub
# ~+ n- a4 {# X  k' |$ e  5. 滚动DataGrid
" W% w1 r  L# b4 W' u. ~0 }1 H  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
! q8 M4 R( ~; R, z+ L有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控% y: B1 P' ]$ [5 s7 e! u0 H
件放在一个DIV中将overflow属性设置成auto
0 c9 X1 u1 W4 m% o; r<div style=“height:400px;width:200px;overflow:auto”>
% R8 T' P! m- K1 ~5 j  h2 C<asp:datagrid id=“MyGrid” runat=“server”/>
& n( ^# }$ m# I</div>
3 ^% o7 I( h( Y, ^3 V- L  6. 动态创建控件1 f8 Z0 F% D$ p! y. @: w* N
  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。  k/ {. A; Q' d7 R9 F) W/ A% `
Sub Page_Load()9 @$ p) v/ |9 [6 g/ ?0 N% s8 I
Dim i as Integer
& G' Y! h3 L6 B" U$ UFor i=0 to 4
2 h6 V- G$ Y/ `4 u" _Dim myUserControl as Control. ]" }) R: B4 x: L2 c/ W
myUserControl = Page.LoadControl(“foo.ascx”)' T2 j/ ~9 O3 w/ v% i# `, \4 O
PlaceHolder1.Controls.Add(myUserControl)
: p0 l" D/ j) M, ~6 ~# {PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))0 m% Z+ @" B  u5 g
Next i+ Y4 M6 E+ M1 a+ B% C( X+ |
End Sub
* a) @6 g5 L3 w  7. 客户端代码的使用
8 w( ]- G. t! w" l( {! P  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标! z0 J: c# U0 v, H! x& J; T
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性# T5 D: h6 G' s3 m6 d8 D# s0 j
asp:ImageButton id=“foo” " t$ H1 m5 }" s, A
ImageUrl=“start.jpg”/ a6 O4 y6 t( s! f, p
onMouseOver=“rollover(this);” 3 n0 ^# o6 @, r) Q4 n
onMouseOut=“rollout(this)”- S% C& s0 P* Y" m  k
rolloversrc=“myrollover.jpg”
& O) X+ [7 z! q* nrolloutsrc=“myrollout.jpg”
  O2 `4 B) E- X$ X& o6 Irunat=“server”/>
0 R6 Q: M. a! @) U<input type=Button onClick=“return clientHandler()”
5 }  ?; A# S$ q2 U6 n' aonServerClick=“Button1_Click” … />
5 J8 ]# L3 X" q1 `0 V1 E  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所# L; m& `- c7 ~+ L+ X, Y, Q
有的客户端控件。8 y8 r2 g1 D' T5 `: s  y( ?
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles & a1 p% L: e% q
MyBase.Load
6 Y, A3 s' k/ O3 x4 l RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")# D4 a4 t2 I/ Z% O2 {7 d
End Sub
2 {; s8 ]. \+ E' C* U4 s$ |) P6 u  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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