TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
A M- N6 x/ d1 i5 l8 r* s求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
4 n$ @" R% y# L) N 1. ~ 的用法) }; \; w7 ~2 B/ t" A) c2 ?- f
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方/ s, k, Z" S! {. U: v
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不: z! D- O0 O, c, ~, K9 g0 ]2 @+ @, N. J
同层次的两个目录的aspx文件分别引用时,问题就会出现了。( G- b \5 ]+ `! h
~/image/about.bmp
! o8 q# s' ?' t7 h' D: T, ~; c是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更( S+ v7 I4 u) _( |, Z
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
2 P: {" C' o3 t* {2 Y3 w它。
' _# {5 C. C4 F, g- | 2. 在刷新和提交页面后,保存你的页面滚动条的位置. X# p3 X+ J3 |1 @5 g, E5 e
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
F0 Z! U1 K6 l用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
: b6 r6 \5 }. [8 Y w- S组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方. |( ]: g/ F" ] o$ {
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
' |! d0 u6 m" a! H0 U9 U* H个控件又需要他选择一下? 1 {6 o7 A$ A! _; {. }
用下面的方法可以很快地确定和记住你提交前的位置。
5 `+ L9 M! ~5 b. b; t- j: N* m. G 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,7 u- A5 {$ a$ e+ u
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
/ h- r* s4 i( w1 R/ FPrivate Sub RetainScrollPosition()2 b4 v, F& N, M6 L3 l
Dim saveScrollPosition As New StringBuilder
: I/ t# w5 G$ u% I4 K9 b* zDim setScrollPosition As New StringBuilder
0 f4 r" X5 K2 ~+ _RegisterHiddenField("__SCROLLPOS", "0")
3 a! F3 @/ ~8 v- x, k1 h7 _saveScrollPosition.Append("<script language='javascript'>")6 r: P1 Z) C) T$ S& G/ w: _
saveScrollPosition.Append("function saveScrollPosition() {")
4 j; q, E. E/ Z; k1 @! TsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")8 o+ F# p1 o% K& A: g
saveScrollPosition.Append("}")
* M: }$ Q; b/ a+ P1 E/ f+ D/ LsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
. \0 ^7 M1 ~, v1 k: l" ZsaveScrollPosition.Append("</script>")
$ |3 o7 k, \5 M" IRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
% P4 }/ L. e) t# DIf (Page.IsPostBack = True) Then8 @( x# H4 ?2 h+ V' h
setScrollPosition.Append("<script language='javascript'>"): n1 X( Y3 r% d, G9 }
setScrollPosition.Append("function setScrollPosition() {") ~% C; @1 L* ?$ y# v
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")7 {. d% E& [( N
setScrollPosition.Append("}"); F, m! y- Z& m* N! z+ ^, o
setScrollPosition.Append("document.body.onload=setScrollPosition;")5 Y; \1 ^6 j4 B+ `7 A. `
setScrollPosition.Append("</script>")7 _5 k3 G+ F6 O3 H; w- u1 j9 V
RegisterStartupScript("setScroll", setScrollPosition.ToString())
$ J+ I' i9 u& M K+ H3 i! UEnd If2 { N; Q: F# S$ z" d( B
End Sub
3 I. y W9 W- H# `7 BPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ( \2 k$ e+ z) p1 D; O* I
MyBase.Load, _- f V/ H5 q0 b% p% {( ?0 ]$ H
RetainScrollPosition()
3 b/ h# r& j" tEnd Sub 8 ]$ ^& L d6 O8 d
, h/ |7 x# ?" a% z7 k5 ]# ]& d
3. DataList使用不同风格的模板
8 u5 {8 ~: d8 G8 m 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条& K8 p' K. w, p, @8 P" [# {
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
) J1 L5 a2 m0 \5 Y9 M+ A4 E# {0 P元素或是加一个促销广告图等等。
1 Q/ ^' e' Y0 n" H2 ?$ yDim theme As String
, U0 D/ l- ]1 K' b" ^" stheme = DropDownList1.SelectedValue0 w0 ^8 v+ `& n% d) P5 x
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool3 G% i. F7 V9 @8 Z& ^. K
DataList1.DataSource = DS
9 d1 L8 | x' \* C( bDataList1.DataBind()
( B V$ B9 Q2 g- V: l 4. 设置服务器端控件的焦点( I% @* Q" O# x# b% l; m
Private Sub SetFocus(ByVal controlToFocus As Control)
5 z. g3 W7 {3 E, B) u8 ]- tDim scriptFunction As New StringBuilder/ l2 t8 \7 H0 q/ ~) s
Dim scriptClientId As String* ^$ l+ z% H6 z3 s G
scriptClientId = controlToFocus.ClientID
% Y/ U. o, ^0 t) ]& ^6 P0 IscriptFunction.Append("<script language='javascript'>")- C8 k' b7 ^+ [6 |( v$ O
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();") Q3 V7 b; u4 q" A4 D
scriptFunction.Append("</script>")5 A- ~5 X, G( s$ y& M% K
RegisterStartupScript("focus", scriptFunction.ToString())- Y0 y% w% x7 V) X( X0 ~) F! e/ m
End Sub1 Q5 b* F* o$ M0 u" G- E7 N" w
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 4 {4 N: y! K1 @) C+ R b
MyBase.Load* j8 l3 i0 O" ]) T. Y' g4 q+ b
If (Page.IsPostBack = False) Then
) H" u C& C4 ]SetFocus(TextBox1)
$ [: H" H2 j G! W, u5 o* kEnd If# e& Q3 S! A" C; C' N" O
End Sub
9 k. m, q/ s3 W0 e. v" {& B2 S 5. 滚动DataGrid
; U G+ \' I2 Z# Y' K 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
+ b" z; |3 D0 Q4 v6 S" g$ Z6 r) w有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
6 u' u* _9 ]. U4 a+ F7 T件放在一个DIV中将overflow属性设置成auto
0 l- O/ Z/ W7 o" ~<div style=“height:400px;width:200px;overflow:auto”>; I% G8 \, }8 ]+ u% r
<asp:datagrid id=“MyGrid” runat=“server”/>
# Y7 G t$ ?1 t7 p: }" Z</div>
5 G$ o2 O5 c# p$ R" x 6. 动态创建控件: W! E; ^" |+ _1 Z4 y! {
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
$ Q0 X9 h+ q5 w$ Z0 DSub Page_Load()+ O0 t# u2 Q6 R: Q
Dim i as Integer, @& B& _8 R; i! g0 g
For i=0 to 4 - e0 w5 }8 a; o. M+ a
Dim myUserControl as Control
6 k% B- I; M5 gmyUserControl = Page.LoadControl(“foo.ascx”)0 X# f5 B9 i6 S" K* P0 f
PlaceHolder1.Controls.Add(myUserControl)
( C' R1 t% z* w3 m+ sPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
4 m# q" a5 _& ^$ B# g; u i, W6 hNext i+ s7 B( ~) U- K" _- _* ]3 }
End Sub / F. C6 {6 I: h6 N" o/ k
7. 客户端代码的使用
: D# B' l3 ~' \% ?" l3 t; I+ K 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标/ M" O5 z+ Q8 Y; j2 S
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
' L% @# Y" N4 Q% Y L x+ [1 Iasp:ImageButton id=“foo”
$ g6 r6 A$ U0 Y8 VImageUrl=“start.jpg”* a( Q- J, _; }' H; x0 ]4 S
onMouseOver=“rollover(this);” ; K8 a; y8 d/ e f/ `. N
onMouseOut=“rollout(this)”* N; B4 m0 Z# l; g' U
rolloversrc=“myrollover.jpg”
7 O* D6 P9 j+ Z& [0 J6 g8 I1 |6 ^rolloutsrc=“myrollout.jpg”- i6 j+ A8 J; F* @$ h; K
runat=“server”/>6 v: Q( u8 t' f$ |( L
<input type=Button onClick=“return clientHandler()”
0 Q" Z8 i) b5 b) ~4 _! ?. f! ponServerClick=“Button1_Click” … /> & Z" |. Y I# h) D3 e
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
5 c- r5 I% [7 a7 C2 ~有的客户端控件。
& @) X* B8 M( O. g. i' aPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles - _2 n" T: f/ {
MyBase.Load
2 v) g0 K7 Q; [) m1 Y" _8 s, b9 y4 u RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")8 A+ e; J( u7 {$ J( M* g2 K- [8 S* R
End Sub
! R6 f9 Q. r' L' v 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|