TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需5 t/ C+ r" x( Z0 ]
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。" t6 v0 O. x8 o% ?2 Y
1. ~ 的用法" T+ v& h: W$ r; \% {, Y! p' d6 Q
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方" ^$ E8 y3 K6 L4 w# n1 R4 N) K" L
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不2 x/ K: V- T/ _) s4 J4 R
同层次的两个目录的aspx文件分别引用时,问题就会出现了。5 S/ {2 }) Y. ^4 L- }
~/image/about.bmp - Y9 d4 J) u0 Y' u" m$ v$ [7 i
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更' Y" A' }- r$ t( s+ D. \
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览4 \/ n9 i+ O {
它。
6 k/ v4 K& m6 B2 z# k 2. 在刷新和提交页面后,保存你的页面滚动条的位置; U& s8 x4 ^: u7 b
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
/ f3 O! C6 ~) v3 r用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸& ^) y/ m, k" B: Y
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
% Y2 h0 F& a; B `# `: | P5 R! K也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
% b, ^4 b% _6 ^个控件又需要他选择一下? ) N+ S: `- T2 M# p2 Q: f
用下面的方法可以很快地确定和记住你提交前的位置。
( {+ V# V+ y% L% E 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
! f3 X% Z: L6 B" l! o7 S2 E不过他使用了Web Behavior这意味着你需要使用一个.htc文件
7 d/ P, N4 | P8 ]( OPrivate Sub RetainScrollPosition()
9 J# L9 {9 a5 X. n7 Q/ ODim saveScrollPosition As New StringBuilder
1 {9 A$ @# ~' a# Y5 oDim setScrollPosition As New StringBuilder
# h6 u& g4 W2 P' e/ `7 gRegisterHiddenField("__SCROLLPOS", "0")
2 `6 ]7 L, ]/ Z b% z' D% fsaveScrollPosition.Append("<script language='javascript'>")0 M/ `" E8 U. _" {' g, i6 H
saveScrollPosition.Append("function saveScrollPosition() {")9 J: v3 s1 G3 C$ F1 G/ D3 K4 v
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
. |" S0 l# ~; w' \' dsaveScrollPosition.Append("}")
* [% C* x( m* V3 a) EsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")( |( t7 k( v5 Z" r
saveScrollPosition.Append("</script>")
% Y9 z+ @" `' [ Q, S# O( mRegisterStartupScript("saveScroll", saveScrollPosition.ToString())
$ i: u: l" D+ ~1 fIf (Page.IsPostBack = True) Then2 F. c# a0 }4 J- t! e) R
setScrollPosition.Append("<script language='javascript'>")
6 X' o6 u0 e( z) ?; usetScrollPosition.Append("function setScrollPosition() {")
* }3 m" y0 ^: C, J' q6 Q: U n. t) xsetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")! {# G6 K! W8 @- z. j
setScrollPosition.Append("}")
4 g" n3 Q2 ^; E9 E9 f o& ysetScrollPosition.Append("document.body.onload=setScrollPosition;")
9 E: h1 }9 U F% O1 e: `, t" UsetScrollPosition.Append("</script>")# \6 n) ? W( D1 L" d4 L8 w+ [8 h
RegisterStartupScript("setScroll", setScrollPosition.ToString())
! F7 s# e0 N& ]5 D8 d) w) uEnd If
! A( m/ F. m0 F) A* T3 B( qEnd Sub
@, E9 y( l. VPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
3 t: Z+ f) M/ T0 }MyBase.Load! H. N4 U0 @% m7 P" _
RetainScrollPosition(): x' s k& E: \
End Sub
( q3 Q. x1 s0 {) `& [# U1 T) }( [( }7 s* F ?# ^1 m
3. DataList使用不同风格的模板# \% y# c- Z/ E2 I, l: A4 q
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条$ L% E' V; z4 j7 Z
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
$ r% }6 k2 D q9 d元素或是加一个促销广告图等等。! c- }1 m! O( |* l# s: s
Dim theme As String. Z, n- f3 o3 I! B9 Y" o/ m
theme = DropDownList1.SelectedValue0 h+ B3 a& C- L( u+ Z
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool0 J' B' }% q1 E$ I2 P+ d
DataList1.DataSource = DS, `1 Y' E$ p1 n) D8 O. ? \
DataList1.DataBind()
6 x/ L" W9 `% f 4. 设置服务器端控件的焦点
8 o$ E3 X5 I3 z, \Private Sub SetFocus(ByVal controlToFocus As Control), T, p! Q5 J$ b" ]2 O4 I
Dim scriptFunction As New StringBuilder% T+ @* J5 P9 p: S9 K
Dim scriptClientId As String% C) ?4 {6 G/ f1 ~6 Q
scriptClientId = controlToFocus.ClientID
; }, ~- {8 K6 W- W0 C* ^7 HscriptFunction.Append("<script language='javascript'>")
2 s8 x5 x. L$ X: YscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")3 Y( u& c8 T; I$ k0 i$ }
scriptFunction.Append("</script>")
2 W. u( n+ L% O0 f+ |RegisterStartupScript("focus", scriptFunction.ToString())
9 r* d; v8 y1 |2 P, DEnd Sub
; @- i! d8 G; H" OPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles # M- e3 e* b* k/ _
MyBase.Load8 H0 j0 x4 F4 O% V* W
If (Page.IsPostBack = False) Then
3 F( u( z: F4 ? I$ z1 ~; d- hSetFocus(TextBox1)
1 T! Q0 b: d ?End If+ w8 `/ m* A- Y# s8 x8 u( d
End Sub * B7 e( J8 F( u) H+ r' h( X, }
5. 滚动DataGrid) G) I, P5 a# M& b
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
$ v% `5 S. @$ |5 M. O有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控) r( x. \) Q$ p# K- O" W* Q K
件放在一个DIV中将overflow属性设置成auto
1 i* w# z5 s* X) R<div style=“height:400px;width:200px;overflow:auto”>) F/ {$ `0 c! ?2 }4 x7 _8 G
<asp:datagrid id=“MyGrid” runat=“server”/>
/ z, A' ^+ @* D1 c3 k. _5 L- G</div> 4 s# b7 @) i: {! B; r+ U
6. 动态创建控件& B! x9 W: r0 E( F6 O' ]" d
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
' @. r5 J* U0 ASub Page_Load()
( [) k6 p4 t, Z' _Dim i as Integer
( o4 L/ z6 i0 _: H$ V( K' Y x) bFor i=0 to 4 3 O; X3 b% B+ T5 ^- @0 J
Dim myUserControl as Control4 I6 J# G( P4 @' f
myUserControl = Page.LoadControl(“foo.ascx”)
* ]) M4 V" w4 a8 s" EPlaceHolder1.Controls.Add(myUserControl)
% s( @& H. E8 Q1 VPlaceHolder1.Controls.Add(New LiteralControl(“<br>”)): E4 p7 T- }/ [' F% [
Next i, m* x0 S7 c4 j6 S" Z) f& ~
End Sub ( }. l. Z6 R7 X& f
7. 客户端代码的使用/ }& M2 b3 t- {6 d J, J
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标7 S( k- K9 x2 L6 q1 a. M0 W
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性2 u" K# P9 V4 d
asp:ImageButton id=“foo” / s6 u! F# i, d# J$ ?% G
ImageUrl=“start.jpg”* J4 ^: a6 U+ e& }% M5 a# @- ]" K! {
onMouseOver=“rollover(this);” ' j' b' a/ y5 d3 m
onMouseOut=“rollout(this)”
4 A+ O, |! p7 h/ jrolloversrc=“myrollover.jpg”) X, ?, h/ M* f7 T
rolloutsrc=“myrollout.jpg”
8 w2 F0 U; c5 J6 k3 h6 M: A3 k* [% `% drunat=“server”/>
, L5 m! J3 J7 ^ H2 O! M6 M<input type=Button onClick=“return clientHandler()” 8 F0 k Q6 k# D( e
onServerClick=“Button1_Click” … /> 4 F6 E1 R" i" \
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
; K2 ^ u- `4 F+ h6 |( n有的客户端控件。
5 D$ B! v3 m! P: `Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
' ^4 C& |0 C- G9 x: l% SMyBase.Load* j0 x# ~) f7 E) K1 u8 i) a, r
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")* `1 K& a& Z. @3 b
End Sub
) l$ e, l, e$ Z9 i' E 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|