TA的每日心情 | 衰 2019-8-18 09:37 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
6 H3 _% ?% D* W求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。3 I+ u3 A3 Q1 q3 ^
1. ~ 的用法
9 W* V% w% e* B; S, T2 c 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方* u4 S p) u, c3 |2 N: y0 b9 L
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
1 o( \$ Z7 }. [+ `' t. K. a9 L. W同层次的两个目录的aspx文件分别引用时,问题就会出现了。
; t) o5 }+ r$ A; o1 m6 l ~/image/about.bmp
9 ~4 t2 d$ w9 C R' q: K6 M' v是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
+ p1 j- E% K. ]* I" t加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
9 h) D1 x3 e& `8 R# J它。4 v: Y! A+ o2 F: E$ p$ s
2. 在刷新和提交页面后,保存你的页面滚动条的位置. q! Y' F+ W6 ]! W+ y5 r+ j3 y
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
! Y% ?3 V6 c6 g+ [6 n用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
. o' O: x# [$ x3 r组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方6 x) Z. a+ ~1 Y1 ~* N
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3709 Y; n k+ x. P$ e; i1 A" A. s
个控件又需要他选择一下?
% `* h3 `6 l. ]/ j 用下面的方法可以很快地确定和记住你提交前的位置。1 [ \1 W+ G7 \% O- f5 l
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,- l" l" N( r' S( t5 d
不过他使用了Web Behavior这意味着你需要使用一个.htc文件5 p5 a/ w5 r6 ]2 j3 k2 c
Private Sub RetainScrollPosition()' i3 r) C1 ?2 w. g
Dim saveScrollPosition As New StringBuilder# v( F) x& Y- X$ n& u6 t% c2 @
Dim setScrollPosition As New StringBuilder
& i7 x \4 H1 U4 yRegisterHiddenField("__SCROLLPOS", "0")
, o/ f8 [ i; AsaveScrollPosition.Append("<script language='javascript'>")
- E2 R' v, ?+ s* XsaveScrollPosition.Append("function saveScrollPosition() {")
: T4 V. U% E0 m2 q( Y( Z+ H7 K0 Q- LsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
1 i' P4 t4 }' gsaveScrollPosition.Append("}")6 R( Y+ q8 A p( M
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")* N, `. j( S$ Q& n2 o/ S
saveScrollPosition.Append("</script>")$ R' ^1 R6 ^4 V4 \; j7 a( r3 l0 s
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
7 u' H0 p: \3 {9 k+ L) A2 f+ MIf (Page.IsPostBack = True) Then! C+ h) N( P) y6 r7 G5 y
setScrollPosition.Append("<script language='javascript'>")
9 {; f1 A/ O$ y6 d* _setScrollPosition.Append("function setScrollPosition() {"). [! O, o0 t2 R1 r, ]6 G9 A; N/ @7 w
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")! B4 K2 [( p M8 m! h$ x
setScrollPosition.Append("}")4 S4 N3 R/ L8 t# }% ]& T
setScrollPosition.Append("document.body.onload=setScrollPosition;")' s% e9 K* U1 r
setScrollPosition.Append("</script>")
, N1 Z& ~4 n$ i% @! T: SRegisterStartupScript("setScroll", setScrollPosition.ToString()): ^' t# h! Q" ^; }) d
End If+ H( B$ e+ D, M( B' v
End Sub
- | ~$ \. y& }Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles % Q8 b# B/ U% O) m* G
MyBase.Load' R H0 ]5 ^6 b# i) t" x
RetainScrollPosition()
0 y% B; \: |5 D8 ?4 xEnd Sub ) r& P1 f9 J, S3 f' y$ S
5 w; c# i8 ?2 Q y7 t3. DataList使用不同风格的模板: z3 J" X( y2 l4 l( G
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
! d9 @* j+ K! U1 V3 h5 V; \8 L' _件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个' \7 O' b/ O. t
元素或是加一个促销广告图等等。
) T- i1 N& E5 {. c' T' WDim theme As String" f' K3 L( r* g1 W; z5 [3 N
theme = DropDownList1.SelectedValue
2 B! W; y( O0 R" v" j! @DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool1 F2 l, K+ A2 `3 i7 }: h
DataList1.DataSource = DS
! [' w1 S+ l. Z0 s8 aDataList1.DataBind() & ^0 g2 B% j4 C, N0 z M
4. 设置服务器端控件的焦点+ d# {1 W( R" Y" D- i; @% n7 E
Private Sub SetFocus(ByVal controlToFocus As Control)- Y+ h# z! B2 B% ` |, o- ]% y, E
Dim scriptFunction As New StringBuilder/ W) n8 J1 ~6 P% {/ g- ^+ U8 y
Dim scriptClientId As String
1 X6 e# Z& a# g1 m% mscriptClientId = controlToFocus.ClientID
9 ]0 O) N V! t# |scriptFunction.Append("<script language='javascript'>")
" o; ^( y0 g: O8 ?scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
2 o- R9 R7 \( _3 O3 S+ S7 QscriptFunction.Append("</script>")
. z6 P. R/ p) l2 jRegisterStartupScript("focus", scriptFunction.ToString())
1 H, _2 d# M1 n( x4 MEnd Sub, E; L" X$ E6 A! F' h
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles " l7 E' r, n" s& |
MyBase.Load" A; f/ f+ R2 e
If (Page.IsPostBack = False) Then! p5 i" V0 k* j: N) A
SetFocus(TextBox1)$ R& h5 ~8 P' a, C. q# p; y
End If0 B; z( ]7 G# T- a: y" k/ }" V% D
End Sub # E. [. T. Q# K# b* ^* K! |
5. 滚动DataGrid
3 C; n* u- n) K6 d 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只# k! N: ]! Z+ H2 V2 |" u
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
( r- |0 `* Q B1 W件放在一个DIV中将overflow属性设置成auto
t) q, z& V, a) F8 p3 Y$ T, P6 T) O/ Q<div style=“height:400px;width:200px;overflow:auto”>
% L8 _2 K1 h u! A0 k$ @<asp:datagrid id=“MyGrid” runat=“server”/>
1 h. m8 P, x* y# p( G</div> 8 D8 n; m) V1 ]1 c" C; T) e
6. 动态创建控件+ I1 c7 g7 L% Y$ N- N9 F5 o, b! p+ y
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。7 _! Q3 V( M# [! N j
Sub Page_Load()% I2 C8 i O) g% g/ S4 B. A d* {
Dim i as Integer, @4 b- |( b' b
For i=0 to 4
, s) F& l$ u1 {' p' E! N2 tDim myUserControl as Control! w: G) |& z2 ^! F5 y. ^
myUserControl = Page.LoadControl(“foo.ascx”)
8 I8 P9 M: P2 p% X8 G) nPlaceHolder1.Controls.Add(myUserControl)
5 ~4 {- A2 a6 ~ X" O: qPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))- a( K: E2 v/ ^% G9 V) R
Next i
2 F# C7 G$ h4 |5 j5 W7 |End Sub
, a0 @, e! {$ \2 n% x. i 7. 客户端代码的使用5 h: U e6 a; E. u- S6 C3 g5 p
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
( W/ A$ k m$ N6 |' F准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性. @* J4 @; l- I! E5 ?% l
asp:ImageButton id=“foo” 3 u7 x* E* f3 d7 X
ImageUrl=“start.jpg”
% \! X1 |$ b& A/ ?2 n1 konMouseOver=“rollover(this);”
9 ]' G8 d2 B2 e' {onMouseOut=“rollout(this)”
6 @4 a: o( t- s* T' ?& z/ U2 Trolloversrc=“myrollover.jpg”* O- U* h/ B6 C" o1 V, ?
rolloutsrc=“myrollout.jpg”
6 X" X) y$ B [4 T. Erunat=“server”/>8 b4 i1 ^( X7 m2 T
<input type=Button onClick=“return clientHandler()”
* o0 G4 Z" u4 a) oonServerClick=“Button1_Click” … />
' D+ ~; ?: S' w! Z- |/ M 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
" b/ _1 K4 q! {/ Y, T! Y8 `有的客户端控件。8 n" g4 R- n) }7 L0 L5 R7 {0 c/ \4 S
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles - V9 k& m7 C* ]0 W
MyBase.Load' w( R# ?: S' X0 X
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
0 P$ t. b* L) J9 E1 C9 {End Sub 8 y8 I3 g7 D0 U5 X) w& {
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|