飞翔无限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 StringBuilder
3 I+ b) T( a9 O/ f0 C$ G B
RegisterHiddenField("__SCROLLPOS", "0")
* r1 _1 M9 _9 X5 c/ A
saveScrollPosition.Append("<script language='javascript'>")
0 d! w2 M# O3 u8 |3 t( ^, D
saveScrollPosition.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- ^ l
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
9 s: {+ e$ t/ P2 c8 @, A' S: B. k
If (Page.IsPostBack = True) Then
. Z S( [ [8 w1 ]% s5 g
setScrollPosition.Append("<script language='javascript'>")
- Q+ Y1 D; n5 ~! U x& j
setScrollPosition.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* w
RegisterStartupScript("setScroll", setScrollPosition.ToString())
7 y& k5 }" P( A+ P* w
End If
" G1 o6 z' }# y0 ~9 P: U. _8 G9 A2 {
End Sub
, L3 B& Q! X9 Q2 U
Private 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% W
End Sub
5 A& s) `2 Q5 Z7 S) [
: f7 Q0 |, v5 Y8 k% Z2 e1 J& G
3. 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 E
Dim theme As String
- _0 L" Y" v/ [: @+ v# x# Y, Y
theme = DropDownList1.SelectedValue
2 K# {3 _* [$ o! C! V
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
0 c% {- ~6 l) x. M- D
DataList1.DataSource = DS
7 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 W
Dim scriptFunction As New StringBuilder
3 @& 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' p
scriptFunction.Append("<script language='javascript'>")
- o) t# E9 G& j
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
4 L( @# O- q/ {3 [: H/ L1 a
scriptFunction.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" b
Private 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) Then
0 J9 }# C5 n; `! ~
SetFocus(TextBox1)
' {% D9 D% s' {, u
End If
) d. v( ?; h( r* y; i7 N h
End 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" n
Sub 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 t
For i=0 to 4
& Z3 y$ }# h- B5 \/ W7 n
Dim myUserControl as Control
. q0 n: c' k5 V3 `
myUserControl = Page.LoadControl(“foo.ascx”)
$ S) O) _( c _- p% s) c; f
PlaceHolder1.Controls.Add(myUserControl)
, t+ g" v" V, T1 {( i! A
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
9 M6 U+ S7 ?4 ]+ F2 n6 m
Next i
+ }3 c8 }, }3 T5 Q; {3 K1 r0 K- u
End 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! r
asp:ImageButton id=“foo”
9 \4 o) V) }; C1 e8 w7 v
ImageUrl=“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' p
rolloversrc=“myrollover.jpg”
2 q- E% D+ L- |: I
rolloutsrc=“myrollout.jpg”
/ j) V" g1 Z( W7 e7 Q& c9 w
runat=“server”/>
: j: f# g* I" r7 a4 \
<input type=Button onClick=“return clientHandler()”
* ?' X2 C0 o9 d4 M- X* X0 z
onServerClick=“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 m
Private 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