TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
3 S; _& q2 Z: j: Q* L& K求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
. D- y* a4 [) X0 n 1. ~ 的用法
; L" I, j7 U9 X$ Y 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方/ b- W4 t' P+ ^" G, I
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不2 B- I2 m. l/ X
同层次的两个目录的aspx文件分别引用时,问题就会出现了。" G: E/ X9 l! t4 L4 V
~/image/about.bmp
9 o9 I% u' A$ A2 x9 f是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更$ A$ e+ [( U6 u1 K5 a& g Y# F
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览% F. n6 ]; W3 f# L
它。+ Z7 b U# q" T, G4 N
2. 在刷新和提交页面后,保存你的页面滚动条的位置
- O8 J* x" n$ |! N+ R; V 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
+ g. S& t9 Q) L9 U9 Z3 [: H' o- k用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸; ^" N( `9 {* V" I G' r$ M4 {* C4 m
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方* w; X. ^$ A3 z8 ^
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
6 P0 J8 z% h+ @0 H0 L. I个控件又需要他选择一下?
, Y7 i- y" A1 P; y 用下面的方法可以很快地确定和记住你提交前的位置。
; B/ L8 K; d" A) Y! a 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,. }3 S9 D1 T" ^2 H% S% \ Q( V; g
不过他使用了Web Behavior这意味着你需要使用一个.htc文件9 g, b" B0 x3 g( J% t, @( `1 C! H# m4 U
Private Sub RetainScrollPosition()
1 T7 q/ `4 S- @$ G4 f4 f* E3 ?0 uDim saveScrollPosition As New StringBuilder& a* U+ ?3 ]# `3 a
Dim setScrollPosition As New StringBuilder
) Q6 e. D5 L# K+ z& E ]/ H5 TRegisterHiddenField("__SCROLLPOS", "0")
2 B- K* T q. @; v* u: q; g' T4 msaveScrollPosition.Append("<script language='javascript'>")8 N3 O8 n7 |1 H. e2 x
saveScrollPosition.Append("function saveScrollPosition() {")9 q1 S7 T1 r# c C2 w+ a
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
* c9 d. Y4 U9 `$ j% X) P/ k) CsaveScrollPosition.Append("}")
0 J4 A% x7 [) N3 I' nsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")- j) g# J i. x( D- D, @
saveScrollPosition.Append("</script>")
% S0 w. B* b$ z( A0 K$ H: V# wRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
- {$ I9 u! v6 O# o3 xIf (Page.IsPostBack = True) Then
: I1 H1 j! x/ H/ c& isetScrollPosition.Append("<script language='javascript'>")
. r6 E. d' c3 x0 O* I5 msetScrollPosition.Append("function setScrollPosition() {")# N& E, u1 ^ X5 l" s( h! A0 v
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
$ R% c8 I `3 O8 r3 LsetScrollPosition.Append("}")
- I5 s. l9 ?4 w1 csetScrollPosition.Append("document.body.onload=setScrollPosition;")
, }5 o; ~$ ]* V$ B4 h# r- esetScrollPosition.Append("</script>")) N: |5 O& X& i, ~% ^- ?6 P# R
RegisterStartupScript("setScroll", setScrollPosition.ToString())% P" d: M7 J: @3 a6 P
End If3 d3 G$ K8 m/ j$ ^* ?! h* D
End Sub
2 a+ Q! y7 A- d* d# ~- A+ pPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles " B$ Q2 ]2 m/ o0 T4 i. w% b+ C6 m
MyBase.Load' V( p |4 y, W# f" ?! U
RetainScrollPosition()+ w" P/ l$ J& E: w9 t
End Sub
/ m! ~/ d+ x$ J+ W: j* Q
0 _3 j4 G- j5 l$ y3 u3. DataList使用不同风格的模板7 x4 ^5 F+ `. G9 [
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条) X. }7 ^, p2 B$ e& h8 w; D
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
D6 B8 h" f" |' e元素或是加一个促销广告图等等。7 U" @) f! k8 I
Dim theme As String& K, q& {3 G' m, W) k8 w
theme = DropDownList1.SelectedValue7 m9 K8 S9 E" G7 ?: V
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
+ |# V o/ K" }8 \* HDataList1.DataSource = DS
* r. N/ T+ ~7 }/ ~DataList1.DataBind() : v) M* G* t, a1 I: X: V
4. 设置服务器端控件的焦点
( H8 w; B2 Y3 F- q/ LPrivate Sub SetFocus(ByVal controlToFocus As Control)* V( ?9 K! w6 K
Dim scriptFunction As New StringBuilder
* C7 {) z' r; G# T' XDim scriptClientId As String E% P' T, X* @2 W/ H1 i2 f! z: ^( }: s
scriptClientId = controlToFocus.ClientID
2 Z# n( C7 d4 p& }scriptFunction.Append("<script language='javascript'>"). a' a3 ~: a. T$ A0 t7 U& z+ ]! W
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")6 U" c" }; [. G0 E7 L5 U6 W
scriptFunction.Append("</script>") e* G. B6 o3 y7 H ^
RegisterStartupScript("focus", scriptFunction.ToString()), o1 d. f+ L% l/ S
End Sub
( Z/ ^4 {9 I- [! RPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 7 a. p0 z6 n t l# X
MyBase.Load
/ d! a7 M( s W( l8 MIf (Page.IsPostBack = False) Then/ }4 B# u, |" A' U
SetFocus(TextBox1): S" p( Z8 B, d; z" u% U
End If6 y Y7 |+ f2 ], n
End Sub
+ u0 q# K1 B0 ~% n- ` 5. 滚动DataGrid
2 z9 N5 }- o( X/ \4 F; v' I/ q 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只$ ~% R2 X8 c3 _' k' W* S; A7 W
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控5 K4 D& J4 d0 ?& G4 ^( w* a
件放在一个DIV中将overflow属性设置成auto
% W2 T& Z7 B5 ~, J<div style=“height:400px;width:200px;overflow:auto”>6 X7 o# }7 l8 s! O$ x
<asp:datagrid id=“MyGrid” runat=“server”/>! m0 O8 W3 `7 `
</div>
7 p% P' ]& N8 { 6. 动态创建控件
5 T/ \# h% o) u6 l4 I9 Y 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。1 ]+ _+ g7 y; x+ b) x3 o) a# n2 X
Sub Page_Load()2 w) h" ~. i& o0 O% r" ?& s8 L
Dim i as Integer
& F3 N- s! [/ K) wFor i=0 to 4
& o) q& g! g0 J; b7 @5 N! `Dim myUserControl as Control
$ W2 e. v; z) h- ~3 h0 x6 ~2 CmyUserControl = Page.LoadControl(“foo.ascx”)8 x L: V' `3 A- E2 A' ^; ?1 D" ` E
PlaceHolder1.Controls.Add(myUserControl)
# O: d& C9 v# G" ?7 N1 EPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))( U& c G0 w+ {1 L; {
Next i
0 a* ^5 h: S6 OEnd Sub - K7 d6 n6 y! d- v. Z7 p& ~
7. 客户端代码的使用
7 [% J/ _7 o3 R, t 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标5 ^" Y! ~4 W( c" O( f
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性4 C. d% L1 ?+ V( Y4 a
asp:ImageButton id=“foo”
7 j- l" u# P/ k1 F( P/ E9 qImageUrl=“start.jpg”
( ]7 V- G% N1 @4 q/ donMouseOver=“rollover(this);” & s1 `% [/ b9 o2 V6 p
onMouseOut=“rollout(this)”
2 W) F1 ~0 n9 i( R9 nrolloversrc=“myrollover.jpg”
! s& L! y( K1 T# H8 Lrolloutsrc=“myrollout.jpg”1 z) H9 d4 K$ n1 k. j; _. _6 g4 _
runat=“server”/>
/ a% w' h. Y+ d, Z<input type=Button onClick=“return clientHandler()” ) {4 I! Q% ?; Q$ F
onServerClick=“Button1_Click” … /> $ N' h: \1 ~! u: V+ m9 c- G4 ^
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
: [( A! _! z, B有的客户端控件。
3 h: b) t6 n) E5 M# [0 G1 S' NPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
$ f# T* j' {# VMyBase.Load# U2 u$ l/ T" G+ f9 ?2 @6 S
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")' t( k7 A+ K* s1 X( O! Y' J
End Sub 2 r0 H. G C+ o0 A( r' q
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|