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

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

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需4 _7 j2 ^/ p3 c3 M
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
% A% W" Z# M$ t, y0 f  1. ~ 的用法
% ?. M2 V( g2 m/ P& S4 E0 y  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方% Q( S, S( y+ ^2 p9 ^2 y- a
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不8 r: Q) V$ n5 z# v' x3 T- z' l& E
同层次的两个目录的aspx文件分别引用时,问题就会出现了。% G$ q  C2 a4 A$ }! E1 V
  ~/image/about.bmp ' g' F( M, y  G* T
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
1 e" o* R. _  C  h( C4 g" \加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
! e2 r1 y1 v) l: k" U" r6 _它。/ d0 U% E+ a, d# L* |0 Q
  2. 在刷新和提交页面后,保存你的页面滚动条的位置
6 H! |3 ?& D4 h1 Q# u2 ]  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
5 d6 m, _5 u* c" `用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
  i2 d' L* _1 \$ \" s, A' X7 y5 U组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
$ L7 P0 ]% n6 O" f% E也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
" D% {1 z& d; X  k/ r个控件又需要他选择一下? + H0 g: q' i$ w! L
  用下面的方法可以很快地确定和记住你提交前的位置。
" j. }& Z: V% R4 A) E$ Q  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,' R7 z7 u2 _/ H! a4 J0 Y# Y  ?5 l
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
) u1 Y- I2 z. x) _Private Sub RetainScrollPosition()5 T% n* o- [) Y7 e
Dim saveScrollPosition As New StringBuilder1 @6 }: E1 ?5 u
Dim setScrollPosition As New StringBuilder
% M6 H% y$ j; Z8 vRegisterHiddenField("__SCROLLPOS", "0")3 R" b7 c$ w% g7 F1 l
saveScrollPosition.Append("<script language='javascript'>")" l4 ~, Y9 J( ]) i9 z- Z1 A$ U$ ]6 O
saveScrollPosition.Append("function saveScrollPosition() {")
) K$ e4 [/ r, a+ g- isaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
9 L+ q( s8 F/ j8 GsaveScrollPosition.Append("}")7 r" d: k3 g, L# \: R; z4 f; a1 U, M
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;"), f# k- [- ~, Y7 e- L$ D
saveScrollPosition.Append("</script>")
' ?+ _8 F2 w& lRegisterStartupScript("saveScroll", saveScrollPosition.ToString())5 ?5 x* V& w" J- a* S8 i
If (Page.IsPostBack = True) Then$ }2 u5 _0 m5 B7 t. d
setScrollPosition.Append("<script language='javascript'>")7 ~9 g& F5 C- B1 [
setScrollPosition.Append("function setScrollPosition() {")
* Z5 ^& n- n( B6 x4 O& V$ q0 {setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")8 I8 Q4 A6 j2 g" F9 e3 i
setScrollPosition.Append("}")# {( F, ?5 P- p% B( j
setScrollPosition.Append("document.body.onload=setScrollPosition;")$ {7 V8 ^; v0 B. Q
setScrollPosition.Append("</script>")/ \9 f* I+ o/ D2 m+ S, |# Z
RegisterStartupScript("setScroll", setScrollPosition.ToString())0 i5 v0 D, n8 Q0 i
End If$ Y6 `, M$ s+ g3 ]# l- l( H
End Sub
% H1 e, ^2 n: A; i! JPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 9 ~0 h" n: e1 h
MyBase.Load
& ~8 j; ^) t2 z  hRetainScrollPosition()
: q, B) i' e. z3 e' oEnd Sub
" ^; M3 D0 u2 R% y( R
  h* H3 |+ ?7 v2 z* a5 t3. DataList使用不同风格的模板
+ `; v; u0 N+ k0 x2 g7 w7 U  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条/ e6 E! [+ J  y* d
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
9 w  y. U* Y) {' T元素或是加一个促销广告图等等。
7 x/ f9 |) A( ~/ bDim theme As String
1 R9 C; ^! D- atheme = DropDownList1.SelectedValue
" D$ [. E+ Z0 ~' u6 d5 LDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool+ V" |% h6 _1 z6 V9 e: }
DataList1.DataSource = DS1 M: f: \' M+ }
DataList1.DataBind()
' c2 l& m# l/ Y2 A: i: O      4. 设置服务器端控件的焦点
; o. h! T3 c+ N+ x+ vPrivate Sub SetFocus(ByVal controlToFocus As Control)
6 p) ?  j/ V" O: LDim scriptFunction As New StringBuilder: z9 O2 _) R, b. C! }6 O/ [
Dim scriptClientId As String8 b: \, l9 l) g9 y, N# x4 S$ \, u
scriptClientId = controlToFocus.ClientID) ?: {/ _; c% W
scriptFunction.Append("<script language='javascript'>"), ]) u, H8 S2 ^) a: |
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
% @# J  q( F; F( K3 q5 A& hscriptFunction.Append("</script>")$ x$ J- J: l) @* w6 I6 ?# e
RegisterStartupScript("focus", scriptFunction.ToString())
9 ^  Q, l  g9 ~5 BEnd Sub. P( i6 m# ~8 l  N3 f) }# C6 P
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles * @+ O1 o6 w. U  D
MyBase.Load
# \7 r+ b; Z/ [/ ^& X* QIf (Page.IsPostBack = False) Then; [% g0 a4 L! L; N
SetFocus(TextBox1)" N6 G, {2 s* T# [2 g9 Y* g
End If  b7 Z: `3 F9 t5 Z7 G
End Sub
! U1 I& X& Q( B: y& A7 V+ T  5. 滚动DataGrid! w5 [- g: j2 f/ c. o. C! z7 \
  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
( Q. L4 S; \9 H7 v& P: y有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
' T+ f0 v5 [. k: E- k2 o" {! X* {件放在一个DIV中将overflow属性设置成auto
) o8 r5 b! ~) |$ t1 N4 |, D<div style=“height:400px;width:200px;overflow:auto”>+ R/ t2 U2 g+ J
<asp:datagrid id=“MyGrid” runat=“server”/>) |& E: A# K7 |6 h; W3 r/ U# |$ a4 O
</div> 1 E  W9 m3 q7 \
  6. 动态创建控件/ s7 t, x) n/ i& T) v+ W2 I
  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。* L. r( k9 w4 c& g
Sub Page_Load()4 T& U6 ?: S3 ]- M
Dim i as Integer3 `8 `1 f6 \; L! c8 A) E) V
For i=0 to 4   \% h# i2 g& L, X" y
Dim myUserControl as Control# H7 t3 P# F% ]5 t" H- c
myUserControl = Page.LoadControl(“foo.ascx”)- f, e. e( E6 E/ |- _# m# R- O% q
PlaceHolder1.Controls.Add(myUserControl)
4 U" j  O( }+ L+ J; gPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
1 @1 y- M: ~$ X% @Next i
) W: ~* b: B' N3 G! T" _9 t& W. vEnd Sub 1 F6 c% O' c( ^$ R! ], M
  7. 客户端代码的使用  q+ j: D6 ^0 o3 d
  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标9 t" J. W& J9 Q' h8 j
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
" e% M% D8 v1 O3 E# Zasp:ImageButton id=“foo”
9 b1 O* `; Z' d/ `+ X1 yImageUrl=“start.jpg”% G5 \0 K2 w4 H9 z. H  J
onMouseOver=“rollover(this);”
% s! q' Y4 \2 {8 T' gonMouseOut=“rollout(this)”& T2 l; J& D  v3 j* _
rolloversrc=“myrollover.jpg”; u" O  q+ z0 {# q5 S& c. V
rolloutsrc=“myrollout.jpg”5 G+ D2 l, J' E/ b" J
runat=“server”/>
- r/ i4 R" o7 [, r9 S4 E<input type=Button onClick=“return clientHandler()”
* M1 E& B3 a2 IonServerClick=“Button1_Click” … />
+ y1 M3 g4 q' T' v" k  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
5 E- L7 q; q2 d; x! H有的客户端控件。1 `* ~% J/ m# O2 ?9 Q. \" P& g) U
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles 6 b  E# G6 J7 B' C7 d
MyBase.Load6 ]4 U. O" F7 j, y  m" l) i9 A& }
 RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
5 X# Q* Y1 K9 W& x- V9 M# M* MEnd Sub
8 G1 Z2 {6 h! I3 ?4 K  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




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