TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
2 D* V. ^9 p+ j$ S: f; C! ^, [- u$ m求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
/ q Y3 W% }+ l; A& P; X 1. ~ 的用法* b1 I" a! d p. v1 q4 [
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方/ P6 A2 `# G% ]( l$ m
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不0 j0 h) O' i! K! {
同层次的两个目录的aspx文件分别引用时,问题就会出现了。# ~: l( O M$ y
~/image/about.bmp
4 @' M" Z; l1 t- V是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更5 h# H; a& B8 l* T) A
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
' ^1 M Z/ ?$ {2 R# t; i6 x它。! u# M* \/ E, f/ @
2. 在刷新和提交页面后,保存你的页面滚动条的位置
1 P+ J) I0 J' H8 w0 v1 o 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
- o: h) i; l3 s$ n用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
0 L3 j7 }! K0 I8 A组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方9 [+ A2 d+ X% G0 T- G) `4 r/ k
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
# F1 h: k0 t" `2 k2 o- B% J个控件又需要他选择一下? 3 _4 w, j4 R9 z- _" ?
用下面的方法可以很快地确定和记住你提交前的位置。- q! @* H+ ?5 b1 D
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element, |5 g2 z C- e. i2 Y( |6 ^
不过他使用了Web Behavior这意味着你需要使用一个.htc文件, g6 S0 q' \ T1 D7 @6 E+ I6 b
Private Sub RetainScrollPosition()6 W9 N1 a9 c2 F8 B+ a
Dim saveScrollPosition As New StringBuilder
! p; u" T( z( \- v3 [" ~5 R- F) x; PDim setScrollPosition As New StringBuilder
" f1 _4 U4 }! d7 G9 L% ?+ T# pRegisterHiddenField("__SCROLLPOS", "0"): C+ R1 ]! `; h+ T' B
saveScrollPosition.Append("<script language='javascript'>")
; T. {3 h- u- }) y) IsaveScrollPosition.Append("function saveScrollPosition() {"); m& G c- \. l8 G7 G/ J4 U6 c
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")$ u: j% e9 a; E6 A3 Q. k: [8 t
saveScrollPosition.Append("}"). P" p3 L3 r, a) m* i( j7 {# w
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;"). H0 k; D% f" q
saveScrollPosition.Append("</script>")* ?4 _6 o; t( S* }
RegisterStartupScript("saveScroll", saveScrollPosition.ToString()). u& }- O% _0 x k7 K
If (Page.IsPostBack = True) Then' v8 Q2 g: A& R j- h0 K" h
setScrollPosition.Append("<script language='javascript'>") `' ?( }( S; r* q3 D2 m
setScrollPosition.Append("function setScrollPosition() {")3 m) D! h2 ~* K4 b1 H$ C
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
9 G$ Z* B9 p0 H& L# v& s: E, UsetScrollPosition.Append("}")7 U. x+ b5 W O4 ^( W6 ?1 [
setScrollPosition.Append("document.body.onload=setScrollPosition;")& \ {/ w, k4 U$ q5 S; {+ A
setScrollPosition.Append("</script>")
. Q6 Y" L; y+ d5 S8 }$ ZRegisterStartupScript("setScroll", setScrollPosition.ToString())' A* W% L6 j4 }, m- t' t
End If
9 @+ i+ ?: @ PEnd Sub
n2 h- x- ]7 i m+ QPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ' x3 P5 h) Q; k, M
MyBase.Load W0 _, e2 f: V @$ J0 V
RetainScrollPosition()
9 K" @/ v1 j" yEnd Sub
1 w; M. |/ L- I" g+ e4 m: m8 g: V7 P8 K% M( F( o% x% G9 X+ E
3. DataList使用不同风格的模板
* b- d L0 V; @. n1 _ 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条/ b" {0 R' o( t. [+ y
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
, p6 `( A4 f; X" j/ d元素或是加一个促销广告图等等。. S2 y! [/ s& {5 j4 v5 a
Dim theme As String, x. p4 |5 _" b# g+ T- U
theme = DropDownList1.SelectedValue w1 N( R% D$ Y4 ~5 s" U# v
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
/ q% K# [4 [* ]% r' p0 _9 \) ?( hDataList1.DataSource = DS
* t* k% F4 h. D0 V) S" C: `DataList1.DataBind() ' @1 i3 f9 x! _/ n. k
4. 设置服务器端控件的焦点" h1 c% E/ J7 v; f
Private Sub SetFocus(ByVal controlToFocus As Control)2 R4 O; W, I) U/ F4 ~
Dim scriptFunction As New StringBuilder
: x0 |- {7 ~ `% j1 y) e/ nDim scriptClientId As String
2 v1 a" n- k# d# L0 W9 ~* |9 wscriptClientId = controlToFocus.ClientID
8 p0 a8 m; ]1 U9 K5 pscriptFunction.Append("<script language='javascript'>")2 G! B7 l' Q+ E
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
0 `5 j4 B5 J+ f, J G4 yscriptFunction.Append("</script>")$ H# V! H6 I" I. F/ ]7 v7 M
RegisterStartupScript("focus", scriptFunction.ToString())/ e- B7 J; Q' k! K( m' }
End Sub
$ F) F, n/ o9 U* X5 ~Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
( {9 b! a9 c3 I5 |6 {. b8 [MyBase.Load
; T: Q) O1 }# ~/ m9 D9 D! j HIf (Page.IsPostBack = False) Then
9 q, b3 a( F, ~. t) p1 C" t' \SetFocus(TextBox1)
7 E: s3 H8 o$ o/ Q$ CEnd If' J0 L$ P; z; I! H0 @
End Sub
9 \, `, C1 f6 Q# q1 E4 V6 w 5. 滚动DataGrid
- t( D/ W' A" I8 Z 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只8 K9 i" M9 B# }" J0 K
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控, X/ v# b& }- S. o. _+ {6 z
件放在一个DIV中将overflow属性设置成auto
2 O( D8 R7 V8 C6 v<div style=“height:400px;width:200px;overflow:auto”>
$ f% g, |$ Q$ }, V<asp:datagrid id=“MyGrid” runat=“server”/>1 u# W7 y8 K9 d! D
</div> $ ~' j/ E g/ f- Q7 W
6. 动态创建控件4 r k- @7 z; r3 j3 P& E( F( ^$ G
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
/ \0 s" n: m( x" U& @Sub Page_Load()
1 s0 A& U$ F5 c# t6 M# LDim i as Integer
/ g! q' X$ ^& C' w2 l% X# qFor i=0 to 4
; V% x4 [% T4 R, ?7 }: VDim myUserControl as Control
+ ^) p. M2 Y% r5 ]myUserControl = Page.LoadControl(“foo.ascx”)) m/ Z' n$ R5 X: ~
PlaceHolder1.Controls.Add(myUserControl)
. `( l4 I( c0 {( APlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
6 _3 k9 j7 \5 t# f# L, gNext i
6 \: o O6 X3 Z: ~& P6 Y' D9 g) ~( ZEnd Sub
! d0 d/ a/ l& r9 j 7. 客户端代码的使用+ d5 P* w% X( E* r$ v! y8 K2 w
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标7 @) _- ?4 G4 b1 o
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性$ N2 A# F O* [: b8 R9 X7 ]
asp:ImageButton id=“foo”
, O, y! J$ v9 {& J$ ]; J% XImageUrl=“start.jpg”, ~, U# v3 n$ f# i3 C& K
onMouseOver=“rollover(this);”
$ a" s4 ~; _9 bonMouseOut=“rollout(this)”
2 s- ?$ L: R' Y) p$ l( Mrolloversrc=“myrollover.jpg” c% l$ M0 @- O. |5 a
rolloutsrc=“myrollout.jpg”
2 _8 `' ]. {+ j; O( F3 E" qrunat=“server”/>7 {* q4 N9 b0 t$ E
<input type=Button onClick=“return clientHandler()” 1 V" m* e* t8 @4 h# P
onServerClick=“Button1_Click” … />
; R K. g; m4 I. b g3 z$ B 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
* {. a" h3 r! p/ T# a2 y有的客户端控件。 Q8 q4 i2 e8 G4 o
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
- }% F' Q0 f9 D+ v9 Q, kMyBase.Load( ]8 n* J$ L6 U5 H; o5 T
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
# J* n ^2 A G0 yEnd Sub
4 x! e# K; e- Q3 S/ U/ c+ Z 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|