TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需9 z9 t& e7 c. m& E% U* t# |
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。* H6 \, [; c: W4 m& R' C" h
1. ~ 的用法
. g/ F4 m) o7 t. p 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
( U- ~% }0 M. u* _4 S式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不0 G+ {1 I0 V3 x# H& [
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
2 U8 _* A' g6 ?7 }( f ~/image/about.bmp 2 D& W. A2 p+ \. N' ]7 \
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更+ b0 ^9 B$ @& e
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
; _2 g* Z, c# U0 b$ h. s* Y它。3 y. |" R" M5 \4 M. ?% X ]9 Y! K
2. 在刷新和提交页面后,保存你的页面滚动条的位置# J, E* s1 ]8 C: t" D+ z% c
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
- w. M: @6 Q1 a* K9 B& p# L$ ~用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸0 ~6 ]1 _# c+ F; O
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
; i7 K1 P# Q0 n8 F; i也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,3709 v2 a0 f% G! f ^( s
个控件又需要他选择一下? , r4 |, L' O' `- q+ {/ l/ s0 x
用下面的方法可以很快地确定和记住你提交前的位置。" K' Z5 j$ |! m* _, I7 N* P) f
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,' m r3 n! |4 A! q) v5 j
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
/ I3 {0 B S! O* S3 a$ ^Private Sub RetainScrollPosition()
! u- o4 G0 q7 s3 p$ LDim saveScrollPosition As New StringBuilder
6 y+ q$ c& V; c0 G4 W% FDim setScrollPosition As New StringBuilder
. m% W/ q3 D- ?5 Q: IRegisterHiddenField("__SCROLLPOS", "0")
% x+ z9 E) z6 @& I+ T- ], osaveScrollPosition.Append("<script language='javascript'>")
/ z" R4 ~7 X4 I4 E) P% s& ~5 \saveScrollPosition.Append("function saveScrollPosition() {")/ X$ C0 [, V$ j& g8 P, F. G
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
' b0 N' |( b) @3 T. d7 y! zsaveScrollPosition.Append("}")
) u$ G7 @" k, m+ nsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
- b- }" C+ y9 Z4 e4 |6 A; i. x0 c) HsaveScrollPosition.Append("</script>")
) b7 D3 x# U$ P: r2 D4 KRegisterStartupScript("saveScroll", saveScrollPosition.ToString())8 F9 i3 P; d; h: X: u5 y4 S1 O
If (Page.IsPostBack = True) Then
, W- ]6 Q5 c7 rsetScrollPosition.Append("<script language='javascript'>")
: ?" x* N8 W# p: N% R! i9 isetScrollPosition.Append("function setScrollPosition() {")
4 [+ u2 ?0 c: }) wsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
" U( D* A: W [+ V8 c+ FsetScrollPosition.Append("}")
8 ?5 A9 W, S3 F, k+ ]setScrollPosition.Append("document.body.onload=setScrollPosition;")
: T- }& }; ]8 l) H) N% B" p( X9 T, {setScrollPosition.Append("</script>")
6 p% D0 H' v- N% SRegisterStartupScript("setScroll", setScrollPosition.ToString()), J) ]/ I) X; t9 D. _' w
End If
' q: `0 O! i1 i2 s7 L9 bEnd Sub
; [1 v; L( c! q) |2 GPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
2 A9 h( O$ Z( F$ i+ `MyBase.Load8 E2 z% `! |3 T" |& i/ f1 e7 L
RetainScrollPosition()
, s+ V0 p% g0 m3 wEnd Sub
9 P6 ~/ l+ n# l3 U4 w% y. I
- `. d3 B4 l+ x1 E3. DataList使用不同风格的模板
; ?5 T6 Z7 J D G8 ` 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条! s4 \9 j( I, r2 o/ S/ S
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
' s+ r* h \' W/ B4 ?) P. L& |0 k元素或是加一个促销广告图等等。1 L: X; w& g7 F6 Q! C; f
Dim theme As String$ Z s e. T3 ^& J
theme = DropDownList1.SelectedValue8 R% K/ u. d1 {# A1 _( Z/ V
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
9 |) J( W- u8 x2 K- [ b6 e. UDataList1.DataSource = DS
! v: `) ~1 }% h* S4 pDataList1.DataBind() ' b0 l$ n" u, v; W, S
4. 设置服务器端控件的焦点
1 k3 ^( b/ p. C& K# P4 r$ |. v+ bPrivate Sub SetFocus(ByVal controlToFocus As Control): e; j8 H& w& m8 u
Dim scriptFunction As New StringBuilder
; k( j. z% T4 k! q3 P" ~( LDim scriptClientId As String7 r+ a; \- {/ s% E0 V% S
scriptClientId = controlToFocus.ClientID1 p4 t! @: \ W8 [4 W( N
scriptFunction.Append("<script language='javascript'>")
0 A9 P+ p; `7 a& CscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
' i. r/ r) w& w& W i2 NscriptFunction.Append("</script>")
- ]) r! ]. @, n/ b3 E2 ORegisterStartupScript("focus", scriptFunction.ToString())
6 O7 y3 i: x$ x2 y' F, S- X' vEnd Sub
' K6 A& s# W6 p0 ] @: mPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles - ]$ m7 z g" ~( \, j2 U. _2 m* b
MyBase.Load
& k% F' K6 W/ J' J+ nIf (Page.IsPostBack = False) Then
8 B# k3 t4 L5 l' DSetFocus(TextBox1); x$ N; i8 J/ q$ ?. [, R- F
End If
4 \) a; E. C6 E' pEnd Sub
( O, l U7 y0 H6 D1 j1 b) j 5. 滚动DataGrid3 T8 T) Z( j/ M5 B/ A0 `
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
9 p9 g! B1 A! H. v5 w. g有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
/ l' t. ]- U) c' o件放在一个DIV中将overflow属性设置成auto
! r# u6 i4 m0 T: B# V$ m2 F<div style=“height:400px;width:200px;overflow:auto”>
* h" Z3 k W. L, Q8 H- G<asp:datagrid id=“MyGrid” runat=“server”/>
9 o( w" `: Q4 @9 B</div> " |9 y$ b" r+ m1 T
6. 动态创建控件9 L# v0 T1 B5 B3 f8 ? V9 P1 M5 K
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。5 f/ q1 k0 W, s9 ^% i- h+ e
Sub Page_Load()- v) Q' }* Y2 i, z
Dim i as Integer
+ {1 l. j c4 g5 {* OFor i=0 to 4 , g/ @ ~5 L, Q5 V' _
Dim myUserControl as Control
. E8 O" O" c. h' v, W: EmyUserControl = Page.LoadControl(“foo.ascx”)' W& D' M& k3 e% C
PlaceHolder1.Controls.Add(myUserControl)) e- Q: q! O7 X# {3 \4 U3 w
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
/ P, H6 S7 x( E" n- J) U s- e+ u- @! kNext i
$ Q# g k& h, E" V4 |. kEnd Sub
9 f; P& F$ s) T$ T' d# Z 7. 客户端代码的使用3 y# t/ G7 g; L' I0 h$ v* e
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
* V, q/ ?! D: _: f. [0 `准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性 U! J$ E% ]. ?: p" v
asp:ImageButton id=“foo” ! n8 t+ I9 ~- `+ T/ B9 {1 z
ImageUrl=“start.jpg”
3 P5 |' E/ t: h+ @" ionMouseOver=“rollover(this);”
' g; D: \3 B( ~ v9 A$ A! yonMouseOut=“rollout(this)”- x, \6 c0 Z# T. P
rolloversrc=“myrollover.jpg”4 b% O4 j N+ V1 p( ?/ Z
rolloutsrc=“myrollout.jpg”
4 g/ K9 \" f1 _+ D4 H% @) p( Krunat=“server”/>
i: F' q- C# K9 M! Y4 E% A<input type=Button onClick=“return clientHandler()”
* @5 J7 y3 D: G3 monServerClick=“Button1_Click” … /> ) \3 J. U' z4 ?6 A
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
4 ~: u4 ~2 Q C9 D) n5 X有的客户端控件。
' ^7 G7 W1 F( E0 J1 uPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles N4 s `# q% V& `5 @
MyBase.Load1 I' {, `' Q p( s0 ^* T
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")9 w: Y" B( g0 D9 X6 r3 q7 _) m
End Sub
2 S6 O ~- d' t! C& n% n* m 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|