广西经贸职业技术学院论坛
标题:
[建站技术]七招制胜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 A
Dim setScrollPosition As New StringBuilder
3 u( Z8 Z: a, p, j# P
RegisterHiddenField("__SCROLLPOS", "0")
2 l* v% f/ d& u9 I1 N
saveScrollPosition.Append("<script language='javascript'>")
7 a5 f, ^1 r2 E' c( x
saveScrollPosition.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 q
saveScrollPosition.Append("}")
, d9 N6 ^& {8 i
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
8 ^& y' X8 f: S+ u Y
saveScrollPosition.Append("</script>")
' p; D+ K" c+ ~8 B- Y1 S" Q
RegisterStartupScript("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" x
End If
2 m* S' r; d o+ Q
End Sub
9 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; m
End 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! I
DataList1.DataSource = DS
. L- T9 z. `+ w* c8 V j/ ~; O( o
DataList1.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; W
Dim scriptClientId As String
1 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+ X
scriptFunction.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 Sub
6 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 t
MyBase.Load
2 N0 z9 a$ W4 p, U. [% Q
If (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 N
For 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# x
myUserControl = Page.LoadControl(“foo.ascx”)
h* o" e7 E! U _8 H& x
PlaceHolder1.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% |( k
End 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 p
onMouseOut=“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 q
onServerClick=“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