TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
* p) C ]& m! C求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。% k- z I& \3 o m$ g
1. ~ 的用法# K. r% y2 _2 |0 g+ H- u6 E# C
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
8 q2 D0 A& I, X( k. N8 n6 I式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不! X( u( f1 r# H9 N- p. ^
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
2 `% M$ l" ~( {% _ ~/image/about.bmp ( M# U6 r8 G: x3 u
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
$ S& M, U9 b( O" A* t加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览3 o8 ]+ a, i5 H" Z
它。% J' U9 t( ^; A; H) h% |# z
2. 在刷新和提交页面后,保存你的页面滚动条的位置 V$ J% T: w6 S
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说7 u& ^. W" q) |
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸; B8 \, c, I, D. W0 u
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方% [0 a+ M4 b2 Z" n: o
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370( T! b8 ?$ A" g. \" F9 a- q
个控件又需要他选择一下? " ~5 G% I4 U8 f
用下面的方法可以很快地确定和记住你提交前的位置。
# [4 |/ N! Q0 A( _- r 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
$ r7 G! Z3 [: N- c" h不过他使用了Web Behavior这意味着你需要使用一个.htc文件
* S' o9 ~% m( d% o- }Private Sub RetainScrollPosition()/ r$ r! \- g6 b* d( W) c
Dim saveScrollPosition As New StringBuilder& e' W# h f* k, s1 Z' v
Dim setScrollPosition As New StringBuilder( |5 i- w$ v7 X" Y5 K0 ~9 f$ I
RegisterHiddenField("__SCROLLPOS", "0")
8 G( _, q' F$ ]saveScrollPosition.Append("<script language='javascript'>")
, x) i0 H$ K2 |- F! ^4 K2 dsaveScrollPosition.Append("function saveScrollPosition() {")
. \" {2 N6 c* I; E. H, Z/ M4 r' ?* `saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
7 {, M0 m5 F" OsaveScrollPosition.Append("}")# N7 s6 |, }: N( e/ j1 H
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
; y Z0 M& |# {6 b7 I* vsaveScrollPosition.Append("</script>")
% x6 A+ N, M) F' IRegisterStartupScript("saveScroll", saveScrollPosition.ToString())- G( e" ?$ }% P" |2 s3 @: P
If (Page.IsPostBack = True) Then" O" v! t) L* G. K& S
setScrollPosition.Append("<script language='javascript'>")
! d6 X" J0 F% KsetScrollPosition.Append("function setScrollPosition() {")
) Y6 [* p/ R9 X' Q$ SsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
; e$ R3 E" z0 f: RsetScrollPosition.Append("}")9 U3 E: x" d1 F& W
setScrollPosition.Append("document.body.onload=setScrollPosition;")( v4 J0 e P) W9 k9 f- O* @
setScrollPosition.Append("</script>")
2 I# c9 b# ?( q; E* mRegisterStartupScript("setScroll", setScrollPosition.ToString())
2 M1 ~1 _9 @, b, |2 h. [# j, MEnd If# ~' V& v7 A4 h
End Sub
; _7 D4 X: J8 j0 z0 ~Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ! L5 S6 o. R. n2 Z7 r
MyBase.Load
9 ?: H6 v0 n" ^# o: ]6 WRetainScrollPosition()7 N- L$ x( T6 p4 _& R U
End Sub
h( j/ c4 P. d5 ]% U- A% x$ g. @$ Z8 t
3. DataList使用不同风格的模板
: {3 ^: m: S2 w$ E. Y, C' S 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条# f" G6 `- y& \! p2 W% C0 V+ B0 B, H7 V
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个/ c' ~$ B& e% w9 R. [4 m
元素或是加一个促销广告图等等。8 E- Q& }% l b5 Y. ?6 O7 ^ K6 ^8 d
Dim theme As String6 ?9 G3 t' N. c$ Z2 [9 ^
theme = DropDownList1.SelectedValue
! p$ i# A' e( Z& H+ j, yDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
& n0 S# Z9 j ?) U6 ?6 ? |DataList1.DataSource = DS5 ]0 y; Z7 h% Z) A
DataList1.DataBind() % ~$ R" s- m+ [2 X* |3 J3 r
4. 设置服务器端控件的焦点
5 H. v9 V/ d4 {Private Sub SetFocus(ByVal controlToFocus As Control)2 ?/ c" y# q g |/ [& I* g
Dim scriptFunction As New StringBuilder, D: |- x5 t3 {" R9 J* a; ~
Dim scriptClientId As String
8 J7 G" C/ Q$ `scriptClientId = controlToFocus.ClientID
. o6 \9 B% o4 l7 \% v: bscriptFunction.Append("<script language='javascript'>")
" J- j1 x; E4 x2 X9 zscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
! l9 D1 M2 ?8 N5 _1 h! O- N) ?6 vscriptFunction.Append("</script>")2 A: o5 v) M$ b$ N0 n
RegisterStartupScript("focus", scriptFunction.ToString())- y6 V; `; a0 r1 @% ^
End Sub
- o( H9 N8 s; j# v1 Y8 CPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 6 d4 c4 Y* a+ L% ], r2 e
MyBase.Load' Y# R) Z t5 j5 O9 M) K
If (Page.IsPostBack = False) Then( j% i* c" |- q: |8 K
SetFocus(TextBox1)
$ Z- L" S" j$ oEnd If$ g& ^, }7 w9 V8 c6 @" d8 K+ l
End Sub - J. g) R( a& j' k+ o* A
5. 滚动DataGrid
3 F; S. c8 o# R/ i. n+ e+ I 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只! T# w& \7 A& S$ ?5 {% ?0 T
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
5 k# s; n; E, M3 S8 t件放在一个DIV中将overflow属性设置成auto6 D+ E3 }' e" g* ~ z
<div style=“height:400px;width:200px;overflow:auto”>- z- o0 ], y' L/ z% g& S
<asp:datagrid id=“MyGrid” runat=“server”/>, Z7 h% w- x( j/ `9 ~4 q( O5 ]+ L
</div> , D& T) ^" A5 c' ^: P
6. 动态创建控件6 E& h" V' R9 [. H
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。- c3 q' }# W9 H( f2 K6 g2 T# G
Sub Page_Load()
) l) q5 q' F3 c: j! uDim i as Integer
. o; i9 s, T/ Z4 ]1 p5 L; F& G1 V. \For i=0 to 4
+ K3 O' A3 g9 NDim myUserControl as Control
v- z) C6 l5 i1 M8 j: F& n% {3 qmyUserControl = Page.LoadControl(“foo.ascx”)
0 `6 R3 R, V. X) ?5 D$ ~% `PlaceHolder1.Controls.Add(myUserControl)
- a/ }* U4 M, z) LPlaceHolder1.Controls.Add(New LiteralControl(“<br>”)) Q' @7 D( V) ?' R3 m `" z( k
Next i
* d: Y9 o3 I% x* o1 Y, r5 LEnd Sub
* R2 |7 k& H) d 7. 客户端代码的使用
4 ^6 _3 Y9 Z; y7 {7 F/ Q 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标( J+ d3 J- g, G
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性( H( A. k; o6 ]# W& [
asp:ImageButton id=“foo”
: N' F9 U( {8 a4 S. ?1 y- h NImageUrl=“start.jpg”
/ T1 O& a [! K# g) U; b* conMouseOver=“rollover(this);” / z a" c+ X0 C W+ U: y- D0 R
onMouseOut=“rollout(this)”' g' H1 J2 g- S' j2 N/ F. }: M
rolloversrc=“myrollover.jpg”
2 ~$ c+ F" z; T8 S! Q7 q T, W# Grolloutsrc=“myrollout.jpg”$ ^* j4 |# R+ y
runat=“server”/>& b0 O: n7 _! d. ?. E2 C$ q8 H
<input type=Button onClick=“return clientHandler()” 6 d1 r/ U! R; a9 G4 m5 ^6 N
onServerClick=“Button1_Click” … />
# v* E9 v+ s' _2 P r! T 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
0 P) c' f c5 j8 j- n% u2 e有的客户端控件。9 |" e! S( X4 i4 g; H# W! p
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 3 _1 [ ]% P( v
MyBase.Load
, t$ H, |% ?1 O# O RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
! k' \/ I% a, q( v2 H9 e7 ^End Sub ) a" P% @5 K. [. {
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|