TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
/ U5 U0 [$ n9 x! ^* L6 G: c! T3 f求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
, a( A w0 h6 R 1. ~ 的用法: w; E( d6 C- ]. ]5 A" u8 h
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
1 s9 W, k- d& v! D* l) v: d式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不& v7 G+ h2 ~7 K
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
# Y- H, I4 ]; e, P6 j. c ~/image/about.bmp ! T3 [' N6 m7 f4 F0 z; g( o Z
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
+ _3 k5 z8 j4 [; J& [$ {加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
+ K% E" v$ n! K- h1 b它。% ~2 O: V1 l9 T/ N5 A
2. 在刷新和提交页面后,保存你的页面滚动条的位置
0 Q# V2 M; M! J O u2 Y 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
- r; g* y, a" I* ~6 G: }用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸- k9 e; y$ E/ n' G$ P) ]% [
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
k1 y, B1 q+ H9 j& a. Z. m也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
; [; k+ J v3 V y5 ?个控件又需要他选择一下?
8 c: F0 E" ?7 M+ ] 用下面的方法可以很快地确定和记住你提交前的位置。, i" k, a! { H/ _( t7 V
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,% S: Q" C' E5 e ]: S0 Y6 g
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
! r& t/ F3 T3 a6 C7 dPrivate Sub RetainScrollPosition()1 ]; [& X& N3 b r; k( L M
Dim saveScrollPosition As New StringBuilder
0 s8 \. D& ~) C- [) G0 y' S- D& M5 PDim setScrollPosition As New StringBuilder6 I1 b% L( l* B
RegisterHiddenField("__SCROLLPOS", "0")
% b: U4 U) t# u$ w: L1 c, isaveScrollPosition.Append("<script language='javascript'>")
" e( U: a v: l7 {8 K" GsaveScrollPosition.Append("function saveScrollPosition() {")+ X J/ w3 \) v
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
! Z }! ~1 J. P& rsaveScrollPosition.Append("}")
, W9 [* \( x8 B- `1 psaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
0 v1 A6 s% y8 u4 {: z; LsaveScrollPosition.Append("</script>")
! f' p! e7 f6 s: D% A5 o! A9 BRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
' q. ]4 ?7 C( X) ^8 lIf (Page.IsPostBack = True) Then3 D% |& ]1 A2 ?9 t0 d
setScrollPosition.Append("<script language='javascript'>")
1 h1 A+ A6 Y/ jsetScrollPosition.Append("function setScrollPosition() {"): ?: A6 l% E- @( _9 r9 s J- r
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")* B Y+ L1 C% @, G1 W" _5 H7 ^9 y5 e
setScrollPosition.Append("}")
$ L& E) c1 d* n) A* A+ `8 PsetScrollPosition.Append("document.body.onload=setScrollPosition;")
- c0 `1 _% p" xsetScrollPosition.Append("</script>")! ]3 ]/ n2 ~" c& h! P6 z Q
RegisterStartupScript("setScroll", setScrollPosition.ToString())0 d4 `: W$ m# O6 v2 [: d
End If
7 w+ j. ~1 q! \4 M3 EEnd Sub- p* V" a( R7 x" Q E0 t
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
4 m! m' Q: z7 A3 X: f+ kMyBase.Load
2 u& c! S$ w5 {RetainScrollPosition()
) z M- X2 N \! m: p, i9 ~End Sub
! a! Q* J% N p' |) X9 L( w+ g& \9 z* |2 J; j8 l N
3. DataList使用不同风格的模板
, i( C2 I7 B; X F# [ 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条. P( ]: z2 ?2 ?3 O/ z5 T) Q- g
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
( A/ ^: a' U# n元素或是加一个促销广告图等等。$ h' o$ d4 l9 t6 @
Dim theme As String4 [) O G! Q1 H w
theme = DropDownList1.SelectedValue1 y. @3 v3 X4 G# |
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
$ v' L2 I- H, d0 D1 ]3 y# q( TDataList1.DataSource = DS
8 Q/ C! H ?% X( Z1 {- BDataList1.DataBind() 5 r( N/ A5 X" n, z, y
4. 设置服务器端控件的焦点* w) n* P1 ^# c7 R7 D
Private Sub SetFocus(ByVal controlToFocus As Control)6 ^2 F( g' X! E' H0 G' c
Dim scriptFunction As New StringBuilder* y) C7 L/ _$ p" R2 j# _% G4 S
Dim scriptClientId As String) H; ]- X' j$ o8 o" _$ Z. v
scriptClientId = controlToFocus.ClientID5 N: E9 V' ]* J8 j3 x
scriptFunction.Append("<script language='javascript'>")% F7 o2 v4 R: ]* ~6 c/ V j
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
: s7 W( x' Z! OscriptFunction.Append("</script>")7 l" p& `1 z9 v4 u
RegisterStartupScript("focus", scriptFunction.ToString())
3 J3 G; w9 Y+ U7 KEnd Sub
f* }5 q' W* }, n9 s6 FPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
$ l/ K2 P8 d! N" d3 O" Q9 {MyBase.Load( T6 c, d8 l; |. R- w
If (Page.IsPostBack = False) Then- f% l! q' n+ N$ o% Z+ g" n
SetFocus(TextBox1)
) E+ r% q& ?% l4 q/ L' SEnd If- O4 _/ u1 j/ \9 q& U. Y& Z7 V7 i
End Sub
- k3 A0 s% {; y/ j 5. 滚动DataGrid3 k& [# b( B& |2 G
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
( H: l3 e# f) y9 H- C7 w7 g R4 k7 A- \有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
2 \, r6 u! S8 f1 ~件放在一个DIV中将overflow属性设置成auto
. T- Y# h* q! P/ ^$ g& ]: t* Y<div style=“height:400px;width:200px;overflow:auto”>
" ]/ [% U G. ]+ x( F% n+ P9 t<asp:datagrid id=“MyGrid” runat=“server”/>
) a4 i- g8 p- ?: N8 X; I' |</div> 8 _. y1 L z& j$ o0 L
6. 动态创建控件
' H) X( Z6 f- G: P& q 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
& r5 m& h) v8 RSub Page_Load()4 k* M6 _2 Y: ~4 P! x2 [; c
Dim i as Integer
, z, q2 j7 W# g8 \For i=0 to 4
* S# |6 P" k& WDim myUserControl as Control
2 i6 j y/ W- {( ^$ |3 V, S9 lmyUserControl = Page.LoadControl(“foo.ascx”)
* B, S# a7 C' ^# fPlaceHolder1.Controls.Add(myUserControl)2 J6 X/ o% W" ?- B
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”)), A- n6 S1 b" I1 p# w7 Z+ u
Next i9 j; e1 h- Z3 Z" a
End Sub
5 M( R8 Z% o; J- s9 Z 7. 客户端代码的使用$ n+ F6 Y& D% h; F& P0 M0 C0 _
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标( Q6 v/ \& P# m' Z0 m% }4 Q) J5 j
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
+ o, i2 R7 [! k! ^! aasp:ImageButton id=“foo”
, ~4 Y) a H# j0 M" A0 cImageUrl=“start.jpg”) |! `8 v, ^$ H6 b) T
onMouseOver=“rollover(this);”
+ g/ \, j; k5 u: z2 X8 }1 fonMouseOut=“rollout(this)” ?* O+ b: I- A4 v
rolloversrc=“myrollover.jpg”4 _ ?9 {9 X: A' i! z/ c% \
rolloutsrc=“myrollout.jpg”
' h" ~% c$ [" `" lrunat=“server”/>* w. S4 S5 l) y/ E2 w* V
<input type=Button onClick=“return clientHandler()” 2 ?) ^ K: N4 h; _5 V
onServerClick=“Button1_Click” … />
% [4 j& Q$ d- t: ?$ k 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
* j5 I( q9 Q0 Y) r$ ]有的客户端控件。) {9 w) O7 t; b1 P* z/ ?; N
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
( {: T" N I/ ~& h; L- }MyBase.Load% V- t# ~! ~/ s* M* D) T( p
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
, v$ z! z) t. z$ G; b( V& g* PEnd Sub ) V$ i9 }! Y, M( n6 T* b8 E; A
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|