TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
7 ^, }/ x7 i; V8 I9 v求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。7 A& I9 [# f0 B+ \
1. ~ 的用法" S; d2 |8 P; w
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
% ^% J0 L7 {# m1 B( _ O式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不7 J; d% r) P8 V% L) p0 i/ e) \
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
8 a8 U9 x' J4 y* m ~/image/about.bmp
t5 o/ H( _6 {% b7 o是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更/ z4 Y% \. d7 c [ B' z+ p
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览+ @/ D+ \; l2 Y I5 w
它。
1 K) E* |* u) `- e! L4 P B" f( z 2. 在刷新和提交页面后,保存你的页面滚动条的位置
* Z6 j* i8 _3 `1 t. I h8 B) i 经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说; U0 l! S- a' l) w0 h8 Z: `
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸+ k3 c9 h$ o8 t) r5 Y, M. X
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
' j0 }# @0 y9 U0 v5 p) G* G8 S; t也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370& r' g( u' D/ [" S
个控件又需要他选择一下? + B* @! r, ]0 v. J6 s9 M6 K
用下面的方法可以很快地确定和记住你提交前的位置。
3 n0 H b" t, |* o 网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
& U. ~, s9 F9 Y2 n不过他使用了Web Behavior这意味着你需要使用一个.htc文件. o; b r0 d- ]4 K+ y) O6 G1 m
Private Sub RetainScrollPosition()
8 a: L& [! M2 W; n* hDim saveScrollPosition As New StringBuilder
4 ]7 w: ?+ S5 n4 v# ^7 ?6 oDim setScrollPosition As New StringBuilder
3 {# o6 e1 p, M7 ORegisterHiddenField("__SCROLLPOS", "0")9 u) b! Q7 d6 Q' M4 T
saveScrollPosition.Append("<script language='javascript'>")
$ B/ q6 |" o! i3 }saveScrollPosition.Append("function saveScrollPosition() {")& |& o7 ^5 k) K4 n9 W% R
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
- D. v0 Z& d! J1 |' isaveScrollPosition.Append("}")
T4 u6 K; r1 [& }0 G% asaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
' P3 P; u6 B1 [3 P: r9 E( ?saveScrollPosition.Append("</script>"): }0 | n) Q5 C' J0 G; O
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
; m5 C7 b& B$ [6 L9 f& RIf (Page.IsPostBack = True) Then+ ?( E/ B- u4 F' U
setScrollPosition.Append("<script language='javascript'>") T# A) @+ @0 n+ H0 w1 k
setScrollPosition.Append("function setScrollPosition() {")
2 [% W& ~! H! Y1 z! y; ksetScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")8 E* b$ E; j4 r( x' _, A
setScrollPosition.Append("}")! Y, c4 D! Q. M/ V
setScrollPosition.Append("document.body.onload=setScrollPosition;")
8 C$ s4 ?6 V6 s5 j% W zsetScrollPosition.Append("</script>")3 W7 U, R( ^' m
RegisterStartupScript("setScroll", setScrollPosition.ToString())
1 V$ k ^, _4 V) E" a7 lEnd If5 h! O1 ~1 @& i- o$ S* i. I- Z
End Sub ^$ U1 E3 i6 n1 ^# {+ ^
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ) ~( Z4 ~ Z7 g9 f
MyBase.Load
, H# U3 i3 q( u1 q0 hRetainScrollPosition()
n* T% \! N6 ]$ w; H- s0 AEnd Sub ; X4 Z" w2 |$ ]/ s9 U% h
/ u1 t$ d: V5 Y2 y( A- d3. DataList使用不同风格的模板
: S$ N% i, S9 G' F 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条1 ?7 Y2 J$ s. C3 e( H
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
$ F6 D% E4 X* m* b) h8 [8 L( ?元素或是加一个促销广告图等等。
: k$ a( ^9 f; D7 I9 I6 U& ]% u) oDim theme As String6 X! p5 d4 i3 p/ ]6 z
theme = DropDownList1.SelectedValue- K/ W. _! Y& q9 W: m
DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool
& q* _, y. {3 ODataList1.DataSource = DS# G- F1 ]4 V3 B- X. Q
DataList1.DataBind()
4 ^* v5 ?; r [; Z/ [3 h 4. 设置服务器端控件的焦点+ R; m& i( b5 L, K- R+ s0 U
Private Sub SetFocus(ByVal controlToFocus As Control)- Q4 t9 f3 d5 k, V0 Y
Dim scriptFunction As New StringBuilder% F8 t) ^. ]# i6 R8 S/ w9 c8 B; @
Dim scriptClientId As String+ O& R- t- D9 Z f2 I# R+ j. z
scriptClientId = controlToFocus.ClientID
+ `, S$ k/ y+ k/ P# U ZscriptFunction.Append("<script language='javascript'>")
/ Z: i9 V9 J; r* j/ RscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")& w3 j4 s3 R' D
scriptFunction.Append("</script>")
8 \# z& y8 x0 J& A) E2 ]/ A7 VRegisterStartupScript("focus", scriptFunction.ToString())* e9 Q& Z/ [& @6 C9 D
End Sub
" A$ s7 R) C; g& \ APrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ~! G+ l, V/ g; Y! c3 H) x
MyBase.Load. J D$ V" Z& l* j# m2 u0 G# @# k
If (Page.IsPostBack = False) Then
/ e3 W! _# o5 I: a4 y2 rSetFocus(TextBox1)5 R% B0 w! T5 S3 Y2 V* E
End If
( J' r: A% ^- o6 aEnd Sub
4 T0 D9 s# O e8 v! b1 o 5. 滚动DataGrid- Q9 [% x/ F7 L+ Y$ m/ k
这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
) m6 Z4 e9 R! ?9 q% `9 j0 N有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
! W8 E( L& O0 k% {/ s& w& F9 k1 L; F件放在一个DIV中将overflow属性设置成auto/ b. x. C0 r! D! L) N
<div style=“height:400px;width:200px;overflow:auto”>
2 L6 Z6 @: `/ T, {+ N2 G, ]3 J: T<asp:datagrid id=“MyGrid” runat=“server”/>; Z7 Q, B4 V, O5 h5 \8 {% q
</div>
. d1 v x' K6 y9 H, I/ k 6. 动态创建控件
; R3 l: C3 R3 B1 b( }0 y* G 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
/ H4 R" d7 c* w; y1 }Sub Page_Load()
; s# R& T: _& J7 L3 eDim i as Integer
. M6 s) l: w( o- J4 gFor i=0 to 4
; @8 {1 {. m* R3 I9 E: oDim myUserControl as Control
* q3 S' g' q) d3 y+ {7 d$ c5 E1 b5 h6 ]4 NmyUserControl = Page.LoadControl(“foo.ascx”)
2 |! z+ J2 s# x. p0 I) w; hPlaceHolder1.Controls.Add(myUserControl)
) Y" t# {/ d' w4 |0 ^: I$ VPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
! C- L6 }+ E, F8 aNext i
5 x/ e. A9 X. x0 W1 ^8 `End Sub
9 ]0 A2 q/ I" Z8 c 7. 客户端代码的使用
5 l9 Z7 I1 t# o9 q* j 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标/ T: T. ^% p5 `4 T4 b/ J
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性$ z9 ~( f# ^# w1 u
asp:ImageButton id=“foo” 0 P) f+ t) x% J* z t3 Y6 K
ImageUrl=“start.jpg”
$ ~. G( |& ]% B4 z5 q t8 J4 {onMouseOver=“rollover(this);”
6 B. { A# T; ?onMouseOut=“rollout(this)”
$ P9 y W. r( O) H" L% V* xrolloversrc=“myrollover.jpg”
1 Q1 Q9 O5 c# R: C4 {rolloutsrc=“myrollout.jpg”
' j: L0 x7 X: ` p. y6 Rrunat=“server”/>
# {$ ?+ ^& q4 v: X; |9 v) s<input type=Button onClick=“return clientHandler()”
- R5 w) e& c/ A9 u! p7 E R* zonServerClick=“Button1_Click” … /> 5 D) w9 f- d& S* P: c
2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所# m# B, ^7 h; U* Y# c& ~/ {
有的客户端控件。7 E9 Q' v. V! R1 X
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 1 c$ u8 s/ M" ], c" `8 e
MyBase.Load
" [" k T! w1 n( Q2 L: { RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
. E9 {% b" g% uEnd Sub 6 Q) u. m+ {+ a
3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|