TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需9 U$ R% ~0 d6 L! R8 m/ n
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。& ?2 g* l q. Q4 M( p' K5 r- @. U& |
1. ~ 的用法: L/ f. I+ u' h7 w) x, c/ A
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
" J! M3 T0 i, a+ V4 M5 o' r式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
' r3 n# S' k/ V: G3 N% ]同层次的两个目录的aspx文件分别引用时,问题就会出现了。
; r( q W7 y" q3 R8 \/ A+ U ~/image/about.bmp
' q- B! g, |* h% k; y' \! K3 m是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更1 M/ N- |$ L8 J5 l& X8 N1 [/ }* Y V. @
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
9 g- E- [& w$ _ q* p0 K' R它。
& ]; B3 ]3 L- i/ F) y4 ~3 u1 N: D 2. 在刷新和提交页面后,保存你的页面滚动条的位置, M9 t( \- c A4 k
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说- `! X3 |, X/ q2 N( g) D0 x
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
+ f- q2 n6 x% d3 G# x# q组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方: J- t/ B- T# a/ |6 ~' b
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370! B" }+ Q# Z, ^. }7 c& O1 m
个控件又需要他选择一下?
% \' r8 ?: d: D( S; A 用下面的方法可以很快地确定和记住你提交前的位置。9 l; n7 d8 k+ S4 G( H# l! S6 f. e; @
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,% |4 H! f* E" J# ^" ~1 Y3 |
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
: C6 Z2 e! l- L# D) e& hPrivate Sub RetainScrollPosition()/ G' i) G8 `, l; T! O$ [
Dim saveScrollPosition As New StringBuilder
! Y9 J( B$ y- |! h4 yDim setScrollPosition As New StringBuilder
. o5 S" t' S6 D7 mRegisterHiddenField("__SCROLLPOS", "0")
8 e, ]' W+ G& T0 dsaveScrollPosition.Append("<script language='javascript'>")1 A" ?2 S) i0 ~0 H9 w/ ?) B0 G, F5 O
saveScrollPosition.Append("function saveScrollPosition() {")! n- z. S! Z, g1 y
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")5 X7 c8 k; b# U$ y# Y K
saveScrollPosition.Append("}")
) F( P! P6 n4 I9 ` Q5 u% qsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
. p( z; O/ K( @/ OsaveScrollPosition.Append("</script>")! j! J) x& H! Q1 B
RegisterStartupScript("saveScroll", saveScrollPosition.ToString()) b" i1 S9 d d% s: O1 V% ^$ @
If (Page.IsPostBack = True) Then
8 Q+ s& L0 F. X8 D* a2 X7 r; ^setScrollPosition.Append("<script language='javascript'>")' d9 F% M# A' \2 ^. }1 D3 H
setScrollPosition.Append("function setScrollPosition() {")! v* I- T9 i8 b6 W) {
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")5 W3 h, P3 ^/ _, K! e7 L4 T
setScrollPosition.Append("}")- R# Y$ c' J; [! \
setScrollPosition.Append("document.body.onload=setScrollPosition;")
* k9 a3 ]8 \; r% k+ o9 \setScrollPosition.Append("</script>")4 q, P/ b( b3 v1 s" \$ B
RegisterStartupScript("setScroll", setScrollPosition.ToString())5 `+ e- W6 t7 Z* Z
End If
* y3 ?1 `5 D5 c. I4 OEnd Sub
& m3 |+ M: g5 M4 ]- ^. P9 {; JPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles $ D% X. B" [$ K% m/ t. }" x" [
MyBase.Load
) A! a! \; o5 G0 o- s8 G1 x+ hRetainScrollPosition()6 Y7 h# @* m& u. ] W G( h- ^# f
End Sub / ~2 y n; S% K- L* K
" {4 U/ w* @& B0 N5 p7 [% t3 O
3. DataList使用不同风格的模板 f8 n! t7 r* v' v
这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条, o6 G, L L0 X) |$ Y1 R% d
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
3 Z7 m8 a( X( Z: w元素或是加一个促销广告图等等。9 e0 y4 F$ r4 n! X9 a7 H
Dim theme As String
* A6 |- y% d# w+ y4 utheme = DropDownList1.SelectedValue0 }2 P+ c& V; A; j' E4 d
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
# q, R- {" P' f/ mDataList1.DataSource = DS
5 d+ b* g! b. ?6 t( w2 XDataList1.DataBind() 6 ]* q' ~- Z& g% k% x2 i, M0 d
4. 设置服务器端控件的焦点. N' D; Z$ d- {+ J/ G! p
Private Sub SetFocus(ByVal controlToFocus As Control)
( }- N8 [- h( SDim scriptFunction As New StringBuilder
: r" n- @9 B, V- z X8 f- qDim scriptClientId As String9 {. ?# ~! x9 B
scriptClientId = controlToFocus.ClientID! |6 S q8 \# ~: M, g! Q
scriptFunction.Append("<script language='javascript'>")
) G( ]! U. N/ U3 H6 E5 G9 L! YscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")% E4 ?+ G. }6 K1 E
scriptFunction.Append("</script>")
$ j" B6 r2 z' e+ ?) \RegisterStartupScript("focus", scriptFunction.ToString())
' G8 [$ X: ~# U: Z6 K) xEnd Sub# u% v: V! ^, M/ [% }9 y9 n
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
! l% K! U Z& ]& Z, [1 V2 uMyBase.Load3 H. Z$ i* q+ F: f# p
If (Page.IsPostBack = False) Then t% I+ J# w9 s9 C: R& w% o" X. a& V
SetFocus(TextBox1)
7 U2 C' @, u* h4 C; vEnd If
+ `0 t. @' V6 gEnd Sub ; g9 C. {3 u6 t$ [# a
5. 滚动DataGrid* r1 k( G* f: s
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只) @) P5 D# x0 }; n9 }8 t
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
6 D3 `- I8 k. R' f8 M, ?+ d件放在一个DIV中将overflow属性设置成auto( i; L& w. V. h9 b( o2 L
<div style=“height:400px;width:200px;overflow:auto”>4 W- s3 O# M- ^; e9 t- L: B( F
<asp:datagrid id=“MyGrid” runat=“server”/>
* m$ I& f, r! ^ B! G</div>
+ h7 T* [5 u$ u 6. 动态创建控件( z3 l0 n! t9 T
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。+ `) n5 ]: q6 P9 S8 d+ r4 \; C
Sub Page_Load()4 `9 Q5 b# Q/ \# y
Dim i as Integer9 V n: N% Y4 r* m S5 k
For i=0 to 4
8 U0 b& `9 k5 f+ J: T: qDim myUserControl as Control* g3 f2 |6 R7 x: t5 y& m
myUserControl = Page.LoadControl(“foo.ascx”)0 ?, T2 \, I! B( p' R7 Y. N
PlaceHolder1.Controls.Add(myUserControl)
, v" E/ s7 J1 ^! ]+ b, LPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))2 o7 X2 \5 G0 Y- M
Next i/ {6 q: w2 I1 L8 X. V: i+ J+ m
End Sub ) ?9 Y' h) G, K3 h4 ^0 e/ l
7. 客户端代码的使用# T6 p- l6 n/ s( |" c! y0 y# H3 F
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标" [7 t7 c- q$ l q
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
' V$ Q% L+ ?( O1 y& `5 F$ k/ Masp:ImageButton id=“foo”
- l) c5 Y' W0 w3 i2 U, JImageUrl=“start.jpg”) i f& K5 l1 [1 T/ \, e
onMouseOver=“rollover(this);”
4 q0 c( ^$ y7 ponMouseOut=“rollout(this)”1 K- P7 w8 V; x+ n
rolloversrc=“myrollover.jpg”4 v1 ]$ C- C x+ z1 k T
rolloutsrc=“myrollout.jpg”
c, Y. J& K0 prunat=“server”/>
! Z- \- S0 z+ h6 \) s+ J: W<input type=Button onClick=“return clientHandler()”
, L7 b" o( Q( U7 i/ Z2 donServerClick=“Button1_Click” … /> 3 r6 M ?2 K' M7 {6 n
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
2 v, \) q1 z3 g8 C有的客户端控件。
3 g# t" D4 N& i, c& q2 Y. zPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles R! z0 l1 q, p) r8 A
MyBase.Load
; g. L/ N" F; S1 V, @, U; X RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');"); b- {! L6 H& X
End Sub
2 p/ _3 ~9 j9 a% `0 T" D 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|