广西经贸职业技术学院论坛
标题:
[建站技术]七招制胜ASP.NET应用程序开发
[打印本页]
作者:
月中水
时间:
2009-10-16 01:25
标题:
[建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
9 Z6 E. G( m+ U- I
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
- \7 C7 F7 K: c# N J! S# t F% W& Y
1. ~ 的用法
, @& ~. G* x* t2 P
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
0 W; u6 h- q8 J) z) Y/ m: H
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
- k6 S1 w5 m7 _. O/ n
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
; k+ H, g5 R: |
~/image/about.bmp
, k9 E+ w6 _. r o( L! k
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
8 A- N7 Z* `9 k2 {& ^
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
! m& |/ m3 X* E/ o& o; _
它。
' q% d1 q. S, K w) x" u* W
2. 在刷新和提交页面后,保存你的页面滚动条的位置
2 `: j+ r/ T2 q6 n( r
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
/ D' l, p1 C- H! V/ w4 |9 p" ]
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
+ o) A+ p1 u+ M5 Q& c
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
8 u w' @# T, X8 U/ c
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
. ^) O1 X. g) N
个控件又需要他选择一下?
8 t1 a6 @* M* n
用下面的方法可以很快地确定和记住你提交前的位置。
- O- ?2 U& G. Z
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
. S/ ~, P5 `2 n' [
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
2 \& W# X$ \& j3 ?& C4 H$ X: m
Private Sub RetainScrollPosition()
+ {$ w# _3 {9 } n3 l, }0 \
Dim saveScrollPosition As New StringBuilder
; k4 g- j# T; n- y! O# b! H6 ]
Dim setScrollPosition As New StringBuilder
' B- \, S% ~9 e/ o
RegisterHiddenField("__SCROLLPOS", "0")
9 c! n" ?9 q4 c) b0 k# Y) A4 N
saveScrollPosition.Append("<script language='javascript'>")
; |( A7 f5 Y/ J0 S# s
saveScrollPosition.Append("function saveScrollPosition() {")
6 Z R1 h( Z+ Q2 \4 U& P) M0 ?! |
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
$ p2 h5 ~$ A5 V; {9 B; d
saveScrollPosition.Append("}")
; |" i0 ]/ A8 a( M0 O
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
8 k7 c, N5 q0 @. i
saveScrollPosition.Append("</script>")
3 Y- X h$ O: V8 A( j8 q
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
6 U9 O9 Q/ O8 E$ U; N$ E
If (Page.IsPostBack = True) Then
/ t6 l# j" I* _! W5 Z
setScrollPosition.Append("<script language='javascript'>")
, y. Z: G) ?$ V- t' K' f8 U
setScrollPosition.Append("function setScrollPosition() {")
) j- a5 h8 v, f; \9 A0 j0 A
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
- O- b- g1 |0 I% ~; k
setScrollPosition.Append("}")
8 m9 X- @7 e& S! ^
setScrollPosition.Append("document.body.onload=setScrollPosition;")
$ O" F# Z5 P( q5 l
setScrollPosition.Append("</script>")
; ^/ n2 W- K/ i! y$ K' O
RegisterStartupScript("setScroll", setScrollPosition.ToString())
% i; Z( B' m1 B! B+ ~5 A2 R
End If
4 s- N' ]! w' B0 k
End Sub
% j* q8 C. N9 l; _
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
- U+ E; h6 y' F/ `' i1 Z* V
MyBase.Load
, }( j9 q! r7 d6 w1 P
RetainScrollPosition()
# B/ ~8 F- j# s% z0 ?
End Sub
$ C: o; P1 ?' G" w3 N$ l' p2 H
* _' Q! W9 o3 |9 M, O8 T
3. DataList使用不同风格的模板
8 W0 s8 {5 s& @- }5 }; J6 \
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
5 k$ j. I! u. }0 {! f' V' A
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
( s4 g2 N0 u! }5 x
元素或是加一个促销广告图等等。
' u* L. ?1 G# [4 L! T
Dim theme As String
4 L. U$ ~: E) ~
theme = DropDownList1.SelectedValue
' H! X/ K$ _9 Z/ E6 G* U8 v
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
4 U" i# a6 q u" X. C, c2 g1 x& C
DataList1.DataSource = DS
$ S9 {) W8 \0 F. i/ l5 e$ q, P/ O
DataList1.DataBind()
+ K- k; {; I% b0 g5 I: V
4. 设置服务器端控件的焦点
9 R: B# U9 f) J; N% j
Private Sub SetFocus(ByVal controlToFocus As Control)
, J2 Y; [$ A9 @. `9 T9 W4 Y
Dim scriptFunction As New StringBuilder
" G* Z6 P$ I( G* w
Dim scriptClientId As String
- n3 @$ X6 m7 N3 u c/ f
scriptClientId = controlToFocus.ClientID
* B5 L3 j4 s' r0 a
scriptFunction.Append("<script language='javascript'>")
5 F# g8 ]0 S0 ]2 Q
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
4 k, F5 P p3 Z% G! |! G
scriptFunction.Append("</script>")
+ n' L7 r }6 u) ?( `) c
RegisterStartupScript("focus", scriptFunction.ToString())
{0 p, D% `/ S7 p3 P s& G
End Sub
- X+ f2 |6 u. k# ^# }
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
# ]/ |) X1 r. b& f9 j! L
MyBase.Load
+ L1 s% Z# p+ W$ \
If (Page.IsPostBack = False) Then
6 T2 u$ ?3 A" S: t* S
SetFocus(TextBox1)
1 u' F$ |0 j q5 u7 |2 ?
End If
8 B* b5 T7 {7 m% T' f
End Sub
. M# s7 H7 B; B- q# s
5. 滚动DataGrid
( R p! t2 l8 s4 v8 J
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
* x" J" H% D" ^( n3 J6 |, [% }) L: |
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
2 ~# S: y. P, W8 s! i
件放在一个DIV中将overflow属性设置成auto
: K- r% ?3 @* O! h7 s1 K
<div style=“height:400px;width:200px;overflow:auto”>
2 ~" [2 k! c4 x+ {) }6 v
<asp:datagrid id=“MyGrid” runat=“server”/>
5 d2 y8 H M( J5 K: ~1 Y
</div>
6 W6 ~* p# \1 B; _4 P
6. 动态创建控件
: `1 G+ L# `' a. |
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
. k7 S" c$ P& @6 d7 F
Sub Page_Load()
$ J) z% X# x5 v8 f7 G. [" p/ l
Dim i as Integer
2 S7 Z) F& H! i3 H& R6 N x/ |6 Q
For i=0 to 4
# G& ~; Y/ H; x# e. x
Dim myUserControl as Control
! @, F& V# p: p( q" J+ M2 }
myUserControl = Page.LoadControl(“foo.ascx”)
4 |: g* L% S5 X5 ~* I; R
PlaceHolder1.Controls.Add(myUserControl)
4 `* g. [! _! z. T6 j( W c3 P$ I
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
# u D/ C8 y7 y3 G) \
Next i
8 l( F/ C9 D4 u, e
End Sub
; L* p9 Q+ h% `' k
7. 客户端代码的使用
& C( B( J# {& U" i; o
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
' g2 z) F- g' F2 a+ }# ~) s4 L6 L
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
/ M% ?3 z- R+ i: L1 ^
asp:ImageButton id=“foo”
0 k" ~5 K5 A& H7 R
ImageUrl=“start.jpg”
# M6 ^4 n: V5 G- G/ ~& }% n! W
onMouseOver=“rollover(this);”
. N" m6 ?: {9 P' A& l& }/ X
onMouseOut=“rollout(this)”
- S- X8 @4 u& D7 ^, o
rolloversrc=“myrollover.jpg”
( U3 `9 r) e& z. N/ V% P8 q% T( I" t
rolloutsrc=“myrollout.jpg”
6 I. R3 \' G" m. h. D
runat=“server”/>
$ l \9 z, d8 o- K6 E) K" m9 I
<input type=Button onClick=“return clientHandler()”
- Y+ e+ Y/ o$ } [0 Q& N R* |
onServerClick=“Button1_Click” … />
( c& O$ Q4 V" w- n
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
8 T* W/ M0 H/ b8 r- p: Q' ]
有的客户端控件。
$ G- o" S' p# K" W9 n$ m+ J
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
1 V. Q* H1 R6 D4 |- J. u* k5 O5 d
MyBase.Load
. U! J6 b6 r, G& R
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
5 j: ]/ Q } `0 p n7 _; K# \
End Sub
9 s U5 p; m& B% |0 z1 ?' p
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术
欢迎光临 广西经贸职业技术学院论坛 (http://gxjmbbs.com/)
Powered by Discuz! X3.2