广西经贸职业技术学院论坛
标题:
[建站技术]七招制胜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 StringBuilder
1 @6 }: E1 ?5 u
Dim setScrollPosition As New StringBuilder
% M6 H% y$ j; Z8 v
RegisterHiddenField("__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- i
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
9 L+ q( s8 F/ j8 G
saveScrollPosition.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& l
RegisterStartupScript("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! J
Private 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 h
RetainScrollPosition()
: q, B) i' e. z3 e' o
End Sub
" ^; M3 D0 u2 R% y( R
h* H3 |+ ?7 v2 z* a5 t
3. 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( ~/ b
Dim theme As String
1 R9 C; ^! D- a
theme = DropDownList1.SelectedValue
" D$ [. E+ Z0 ~' u6 d5 L
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
+ V" |% h6 _1 z6 V9 e: }
DataList1.DataSource = DS
1 M: f: \' M+ }
DataList1.DataBind()
' c2 l& m# l/ Y2 A: i: O
4. 设置服务器端控件的焦点
; o. h! T3 c+ N+ x+ v
Private Sub SetFocus(ByVal controlToFocus As Control)
6 p) ? j/ V" O: L
Dim scriptFunction As New StringBuilder
: z9 O2 _) R, b. C! }6 O/ [
Dim scriptClientId As String
8 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& h
scriptFunction.Append("</script>")
$ x$ J- J: l) @* w6 I6 ?# e
RegisterStartupScript("focus", scriptFunction.ToString())
9 ^ Q, l g9 ~5 B
End 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* Q
If (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 Integer
3 `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; g
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
1 @1 y- M: ~$ X% @
Next i
) W: ~* b: B' N3 G! T" _9 t& W. v
End 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# Z
asp:ImageButton id=“foo”
9 b1 O* `; Z' d/ `+ X1 y
ImageUrl=“start.jpg”
% G5 \0 K2 w4 H9 z. H J
onMouseOver=“rollover(this);”
% s! q' Y4 \2 {8 T' g
onMouseOut=“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 I
onServerClick=“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.Load
6 ]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* M
End Sub
8 G1 Z2 {6 h! I3 ?4 K
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术
欢迎光临 广西经贸职业技术学院论坛 (http://gxjmbbs.com/)
Powered by Discuz! X3.2