TA的每日心情 | 衰 2019-8-18 09:37 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需+ }) {- Y6 [1 A+ K! d: o9 T
求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
- f( [) L: ^# Q% t 1. ~ 的用法
- X9 P* i+ p7 i7 s 一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方! }0 e- \) G! Q# s. e& `
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
2 [8 Y" h; ]! }3 G同层次的两个目录的aspx文件分别引用时,问题就会出现了。/ L2 m2 {( D$ X2 d0 z
~/image/about.bmp ! w3 L2 z4 K0 C* J7 V
是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更
* z* k! R2 b" Z+ F- p) t, a' b0 H4 y加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
7 R" L% s2 D4 Z7 {" B" I- L它。
- @) J c5 X) p& i. {/ Z5 B3 r; s( i 2. 在刷新和提交页面后,保存你的页面滚动条的位置% K5 I' a! H6 H$ ^9 S* R
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说# |. h. k! g! a: _, I8 H8 ^
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
1 { `+ w5 |$ ~# T0 v1 {组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方3 \2 ]) u! a' K
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370
~3 y& f# c% }& F个控件又需要他选择一下?
4 n1 e& y2 Y1 a% c) }# d 用下面的方法可以很快地确定和记住你提交前的位置。; @ J( T+ ^" V. B8 V/ e1 L& h0 D
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
2 t0 H w- Q* m( l6 V不过他使用了Web Behavior这意味着你需要使用一个.htc文件
: R1 S6 W8 F3 E2 ~5 Z* ZPrivate Sub RetainScrollPosition(). e3 ]9 Y3 r. w
Dim saveScrollPosition As New StringBuilder
3 P& H8 G6 v2 b( uDim setScrollPosition As New StringBuilder
+ @4 L* w$ p5 ?" fRegisterHiddenField("__SCROLLPOS", "0"), {) \8 d) f# U7 T4 D/ l/ u, m
saveScrollPosition.Append("<script language='javascript'>")0 Z2 r; i/ l0 E$ _9 V* q3 V
saveScrollPosition.Append("function saveScrollPosition() {")
& g4 m, e+ X) ]. MsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
" T, t8 h. ~ A9 ?( ^- XsaveScrollPosition.Append("}")2 Z- k: K- R# f) V# [& _9 }
saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")6 I5 Z( x7 ]/ _- T& `% f
saveScrollPosition.Append("</script>")
1 I- B y) M6 C* e p5 [0 u0 l ?: h9 xRegisterStartupScript("saveScroll", saveScrollPosition.ToString())3 {9 l$ h. _; G0 h7 t4 g: A: j
If (Page.IsPostBack = True) Then4 w: r$ w; w6 y- x" g. M( y
setScrollPosition.Append("<script language='javascript'>")1 ^* m% P" q) {/ i
setScrollPosition.Append("function setScrollPosition() {")
( p0 g+ h# v+ G+ L" ksetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")0 x- T' w5 S, t8 {# s# B( P% H
setScrollPosition.Append("}")2 ?4 u1 G- S! q- d% {/ _
setScrollPosition.Append("document.body.onload=setScrollPosition;"), b4 |, X6 x0 J# B T! F
setScrollPosition.Append("</script>"): c$ R8 Q' m( k& A3 Y! O+ Q7 f R$ ]
RegisterStartupScript("setScroll", setScrollPosition.ToString())
( O' R' ]' U, I ]& I0 A! ?End If( E& U% y) a( I/ c1 J
End Sub
8 l. E: z$ R6 W2 p2 TPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles : ?$ g5 e& O2 z& D! i, c
MyBase.Load
P$ i$ U2 b; ]* o6 K2 NRetainScrollPosition()+ E( ^% P+ ?# o+ U. C2 Y! o2 o
End Sub
( [4 ?6 ]8 R3 r( r4 D- D5 X* k; E7 i( l/ J, E9 T1 v
3. DataList使用不同风格的模板
$ ~7 w* d% N5 p9 J- |* U5 ~# F9 O& o( t 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
4 a+ @! Q4 }4 ~! ]8 g) h' ?. C件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
6 N, i) a$ l# V; O$ O元素或是加一个促销广告图等等。/ I ]8 r% W- Y* W/ e
Dim theme As String: J- _! u" A9 Y4 c. L. x( N2 [( o0 B
theme = DropDownList1.SelectedValue& B @2 ]. X$ T' j: o7 q' Z, U
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
/ K2 e; `" c" T" c2 i; \0 U2 C& uDataList1.DataSource = DS
8 K1 \% B% C0 }5 i; fDataList1.DataBind()
. s9 ~/ k4 w0 m2 q# H: P 4. 设置服务器端控件的焦点
6 r% Y' x5 i) [3 g4 _2 iPrivate Sub SetFocus(ByVal controlToFocus As Control)
4 j2 k, f* K! |- ?6 L1 l( i4 v2 fDim scriptFunction As New StringBuilder' i" c$ e( t6 H% J
Dim scriptClientId As String. v0 d; M( e0 X c. h
scriptClientId = controlToFocus.ClientID
* U# T t9 e" h) `+ `scriptFunction.Append("<script language='javascript'>")
7 ?# u. c8 H" {4 ^' N1 r0 gscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")+ p' o: O( F5 I7 O
scriptFunction.Append("</script>")
3 S3 |4 @& M0 H* J5 J/ wRegisterStartupScript("focus", scriptFunction.ToString())
, [5 P# ^( Q3 F+ ^4 @$ KEnd Sub, K$ ]( ~6 {2 g# v- O
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
5 w; x2 W8 k0 j6 a6 ]- aMyBase.Load Z8 {# ~ M/ S5 h' F4 e& e0 N
If (Page.IsPostBack = False) Then( B) A+ _" w$ |/ A, Z- } {
SetFocus(TextBox1)
3 `; `& A. w, S# _5 VEnd If" e& q: u/ D5 p6 E
End Sub
- d- }7 ]1 y* S; @! V2 S 5. 滚动DataGrid
7 x7 X3 P% c! v/ p 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
7 |0 x/ m- n) g/ |4 e; V有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
- e S: d! a8 J2 K8 a5 C l件放在一个DIV中将overflow属性设置成auto
: K2 o9 Q5 {; q- C8 l9 {4 `0 z3 T6 ?<div style=“height:400px;width:200px;overflow:auto”>1 X; y! G; l1 I4 g
<asp:datagrid id=“MyGrid” runat=“server”/>
& |" y& `% D) N1 o) L4 {2 ]</div>
; W$ |$ c# h! k, }1 {# h6 m 6. 动态创建控件* s' u+ z* P" V. v7 \* k
利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
5 J- u- ]' @3 l) x$ o+ L4 NSub Page_Load()
" N6 f1 D! c. c# D+ }" E5 k) gDim i as Integer
6 N: Q% Z+ j- l4 O! ^. ~+ SFor i=0 to 4 5 c& P. p: p& P, \8 M! {+ h/ ~7 J- N
Dim myUserControl as Control+ \8 U2 V) }. L G. b: ?( p
myUserControl = Page.LoadControl(“foo.ascx”)5 k( N+ E& c! V3 l$ J, }) X" k. U
PlaceHolder1.Controls.Add(myUserControl)4 E; [4 q, l! W( ~& _1 H* n
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))+ U! |' i" n, l
Next i& l4 ~/ L0 D& L ?; L+ w
End Sub ; e2 X5 M+ s7 N' [ `
7. 客户端代码的使用
3 s4 x8 c. I( \& q+ [. {6 ^ 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标
+ r" g1 y- r! ?1 y: e3 _3 B准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性. ]* d. V$ a0 {, y# ^- n. P) I
asp:ImageButton id=“foo”
, R+ y4 k2 U" X P+ mImageUrl=“start.jpg”1 C( t% ?; R: E) ~
onMouseOver=“rollover(this);”
% |$ D* H" `1 N7 r6 k5 x# A) QonMouseOut=“rollout(this)”# S2 s, p0 L( Q
rolloversrc=“myrollover.jpg”
9 P" d4 n$ x# H' c4 L8 y6 Prolloutsrc=“myrollout.jpg”
% u9 H. C1 P' k% E' X1 grunat=“server”/>
4 O, r, b9 v+ G' l, M1 x<input type=Button onClick=“return clientHandler()” 5 W9 q6 s, z- d6 p( e4 z1 Q5 V
onServerClick=“Button1_Click” … />
9 Y/ g/ a i! ? @0 P 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所
- u) w( R: y6 Y s* }: f/ S有的客户端控件。
% g5 S8 s% C2 S ^- z/ JPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ) U2 y/ F; C' n2 U4 H( x
MyBase.Load3 M/ e: n. Y! H6 c6 X
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');") w5 X! C9 [( e; r' u# \' H: q: o
End Sub " S) O$ G9 H# e5 e0 i. _$ ]- B
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|