TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需+ l4 f/ J! G2 Y& T+ L+ T/ y
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
Y2 _. ?* n$ Z' i/ X/ K' J' K. T" U 1. ~ 的用法
! u7 o, o( T* B. w 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
2 T( v f5 |3 o8 D8 _- N- D式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
6 b$ A/ m5 Q$ X同层次的两个目录的aspx文件分别引用时,问题就会出现了。
3 Z6 Q3 N3 F6 z) [0 O" ^8 I' O5 S ~/image/about.bmp % n! e' b7 ~7 b
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更- ^# c8 L+ Q# h+ D1 l4 u
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览5 ~! A4 A/ v: V0 u$ ]7 W
它。7 I! d a) @& H* n; g3 J2 c: r
2. 在刷新和提交页面后,保存你的页面滚动条的位置. Q2 c# ]$ O7 p7 Q4 f- f2 ^6 O
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说! \! P5 T9 d- o ` z: w; d! r
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
, r9 |; M E+ J% }1 b组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
9 U8 ?4 F+ C- f! K也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
8 e: Z- |3 N7 }! H. W! m个控件又需要他选择一下? 1 z0 v2 ?' Y' d
用下面的方法可以很快地确定和记住你提交前的位置。
9 o3 e' L T; |* g3 A! y7 A 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
, N$ [: H' Y* f+ E( q8 N9 R不过他使用了Web Behavior这意味着你需要使用一个.htc文件
6 F7 ^$ ]6 y. h5 {" h6 i: rPrivate Sub RetainScrollPosition()$ V; i% L9 P1 {4 K" ]
Dim saveScrollPosition As New StringBuilder! E2 o+ g2 A* h: ^8 s# @6 J8 e
Dim setScrollPosition As New StringBuilder+ _) e4 c5 d, _# R
RegisterHiddenField("__SCROLLPOS", "0"); D9 Y, V7 T9 |7 J! V
saveScrollPosition.Append("<script language='javascript'>")
* a$ l6 H# g1 x8 l8 U* _% QsaveScrollPosition.Append("function saveScrollPosition() {")' J( }) |9 U+ l: }
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")2 |# _, @ {' t# s5 [9 t9 U0 t$ M
saveScrollPosition.Append("}")# c H0 }1 C# }; O. a. f* h% ~% ?
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
; }- v7 ?- w: I' i" SsaveScrollPosition.Append("</script>"). \# L4 t3 d+ k' g5 o* O
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())3 p6 {, i' m) a" \! I# z# U: O
If (Page.IsPostBack = True) Then- X o" j; a+ {5 V5 }% ^# V" a
setScrollPosition.Append("<script language='javascript'>")! c. q) O- l9 ], `7 ^8 L
setScrollPosition.Append("function setScrollPosition() {")9 g; f" F3 L& v$ i) ]$ u: q5 T2 i
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
0 |, x, s" R6 I9 N# EsetScrollPosition.Append("}")
, T8 d6 ~. F, u8 K. x9 k- rsetScrollPosition.Append("document.body.onload=setScrollPosition;")7 F: ?' P& ^* O# J3 N0 F: q
setScrollPosition.Append("</script>")' Y8 | ]7 |7 G9 ` [
RegisterStartupScript("setScroll", setScrollPosition.ToString())
7 M- H2 b$ K; E4 [" MEnd If. N3 `" q% ~ i8 A: [7 } x
End Sub
2 s6 G" V* u- z, \1 s/ z2 z0 zPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles " L4 j; S; s9 V! i* k) {* @
MyBase.Load+ Z- p+ ?4 x$ J7 H% z
RetainScrollPosition()+ W) v5 C5 r0 R- |
End Sub ! z9 o+ c7 \5 a6 L" h6 r
! k- k- s( E1 U( K$ H3. DataList使用不同风格的模板
- t5 K. J4 u6 ?) a8 y 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
! J- g' L2 v; `, G; S$ S7 H件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
- I9 S; X5 B2 b* F' ~7 I元素或是加一个促销广告图等等。
0 j' X: u- }5 e s4 p. y: [6 ^) LDim theme As String
9 V* U( x/ P Ttheme = DropDownList1.SelectedValue
1 d, D/ Q: y/ cDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
8 w, D5 B! D( m" PDataList1.DataSource = DS6 Y3 ^0 s; c+ n# p7 b- ]2 }* U7 H
DataList1.DataBind() + J, c( c' a& {5 q5 V3 D4 z; z
4. 设置服务器端控件的焦点
- o. w! a1 M2 S( l6 M+ _Private Sub SetFocus(ByVal controlToFocus As Control)! @1 s" ?) h0 G& |
Dim scriptFunction As New StringBuilder" t) H. J/ |! D) n
Dim scriptClientId As String2 e. l0 h, K( e
scriptClientId = controlToFocus.ClientID- H% M) v) I" g3 u
scriptFunction.Append("<script language='javascript'>")# y1 `9 V3 @3 t
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")+ r' z! X( @' K h2 ^' _
scriptFunction.Append("</script>")
1 [2 e! A0 w- V2 P( s6 C8 {, F3 c3 _RegisterStartupScript("focus", scriptFunction.ToString())
/ {. s) P* h4 `! }! e" O; NEnd Sub4 |; {! o. X, C4 _( j' v6 I! `/ U4 ~& ~1 F
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 1 H. _8 j3 U7 _# J1 r; Z+ X6 f
MyBase.Load% H8 S8 T& w5 { R7 j
If (Page.IsPostBack = False) Then
! H: I5 O- o6 ?5 Z4 W* |' mSetFocus(TextBox1)
# b" h; o- |! U0 iEnd If
( j% _8 @2 i1 N6 t$ g2 U# y7 nEnd Sub ' G) o' y' d" V% N+ o* M7 I
5. 滚动DataGrid$ P. C) x7 J6 R; Y8 I, x
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只* y. z) U7 J- |- B2 W# u/ P* n M
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控8 N) {& L3 @! K; Y1 Z5 z
件放在一个DIV中将overflow属性设置成auto
$ g% X( S# }' [# N9 [( N" ^- h<div style=“height:400px;width:200px;overflow:auto”>* n& C+ Z# [0 E( S/ s! p% c1 i
<asp:datagrid id=“MyGrid” runat=“server”/>
! |6 k" u" e4 l; j* \4 P</div> # q$ B0 b3 t6 R2 I
6. 动态创建控件
! ^1 a% _' b" c9 e. n9 l, m8 q) R8 G" Z 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。1 ~! b2 ]0 o8 {+ W
Sub Page_Load()! H# e, O3 E7 |- k6 z
Dim i as Integer' t0 Q- q- h. O1 M
For i=0 to 4 9 Q. m( X) f/ M0 R
Dim myUserControl as Control
) H( s( M t% e2 e0 T9 OmyUserControl = Page.LoadControl(“foo.ascx”)4 H* d; @- p7 ~. \/ F
PlaceHolder1.Controls.Add(myUserControl)7 p# ]7 @" Q9 X# ^$ B
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))1 W0 h% Q/ l% v9 n! Z7 i' ?5 N- t
Next i
: s/ J& p5 a' H" C8 B" k3 KEnd Sub : K3 f: b0 y/ S9 r: S4 }- s: ^" l
7. 客户端代码的使用+ G4 u; a: D2 O/ K; n' t
1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
! X+ Z& F: E8 O- U准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
& E# s4 l3 [& f% A7 T6 G4 V4 P/ {asp:ImageButton id=“foo”
$ j7 h7 z A: ^5 t; ~' V& ]ImageUrl=“start.jpg”
6 s" }- z5 J1 OonMouseOver=“rollover(this);”
4 g1 ]: R; o. s7 h. L7 w5 sonMouseOut=“rollout(this)”
8 C. I7 N; ~/ n7 mrolloversrc=“myrollover.jpg”. b* y d% F3 f: `- n7 x2 o
rolloutsrc=“myrollout.jpg”
' s! n$ d# P. l; F- K' grunat=“server”/>
' C5 B! j4 D+ p# P' t# K<input type=Button onClick=“return clientHandler()”
( v/ n) R: B7 monServerClick=“Button1_Click” … /> # ?& d6 N+ q( ^1 O" Q) Z" p6 w5 z
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所6 s ?0 }3 M+ ~2 Y _# f
有的客户端控件。
/ j6 M2 E3 Z& B w( LPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ) l C5 P( F# V, G1 X1 J$ y8 }) Q
MyBase.Load1 G- x. U4 ?% P5 S# p" v
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")/ }3 a7 U. N3 R5 [! q
End Sub # v7 V3 r7 t6 t+ c$ `9 A9 [4 p
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|