TA的每日心情 | 衰 2019-8-18 09:37 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
9 {" W9 G. ~% o/ x2 M+ Z I1 s求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
: T" S0 @# u& q" S7 @; ]& c 1. ~ 的用法8 q1 q+ S8 ]! ]# m& q7 c1 A
一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方
O( T7 h, @% M1 E1 G式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不2 e# W0 A( D8 Z' Q, b1 F
同层次的两个目录的aspx文件分别引用时,问题就会出现了。
8 g- `& Q r; C" X& x$ k8 ] ~/image/about.bmp
Z$ Y. ]7 n0 M/ D& Q& N$ e4 c. @是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更" h% b1 y7 M! h
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
5 g2 r9 N7 H- V它。
8 |% |* R9 d3 U) H 2. 在刷新和提交页面后,保存你的页面滚动条的位置/ G$ Q2 D8 v5 z* @% C
经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说
% M) _0 y7 |. A+ T0 G+ H用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸
% t2 `/ O& s f2 A& ~+ Y' s组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方 a! l( J# Q% ]4 O2 A5 }
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370* L) ^: y* O6 p; U' L$ N6 n: x. ~
个控件又需要他选择一下? 4 Y6 ?) K9 a8 ]4 G' r
用下面的方法可以很快地确定和记住你提交前的位置。* H6 Y( I4 p1 {
网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element, U2 e' i0 Z6 q9 K/ T
不过他使用了Web Behavior这意味着你需要使用一个.htc文件
# j( N( C! W8 v, V1 u) _/ ~8 UPrivate Sub RetainScrollPosition()3 y8 W' `# ^2 i4 k- e$ i* h. `
Dim saveScrollPosition As New StringBuilder. j9 h! ^8 }3 f7 O. |- f9 o* ^* W! e
Dim setScrollPosition As New StringBuilder6 A5 C$ k! I% T
RegisterHiddenField("__SCROLLPOS", "0")
% B8 |+ J3 e- {- [! [1 {7 q" Y7 p# VsaveScrollPosition.Append("<script language='javascript'>")
?7 h: C% L6 r" c% DsaveScrollPosition.Append("function saveScrollPosition() {")" H/ O1 L% I! K. n9 {4 W
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")$ F9 N! {, }4 n- k Q
saveScrollPosition.Append("}")
, e) f C9 t. Z+ `+ GsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")) c5 f( u n/ G) k. |& W/ ]
saveScrollPosition.Append("</script>"). \+ r3 W; V" ~- O9 J4 e: R
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
% m' M/ K& J- u6 s% ]If (Page.IsPostBack = True) Then
7 T- X9 C6 N% IsetScrollPosition.Append("<script language='javascript'>")5 e0 T* Y/ ?) o3 |9 d, H; j
setScrollPosition.Append("function setScrollPosition() {")& v; I) f% E6 G/ A. m" C
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")4 A9 i* s0 r9 P0 J- B, K" e: m6 v
setScrollPosition.Append("}")
7 O) A9 A% B5 Z7 h( p# YsetScrollPosition.Append("document.body.onload=setScrollPosition;")
/ |1 N3 P3 k7 D) YsetScrollPosition.Append("</script>")
& q* P S& g) `! f1 l4 N- mRegisterStartupScript("setScroll", setScrollPosition.ToString())
+ f B+ R* T4 F+ ~7 Z' Y+ GEnd If
0 t, f2 }7 y9 O9 B$ [End Sub
$ z6 f7 j1 |- |0 ?. A, F5 oPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
+ N% z6 J7 `- {% H( X2 `MyBase.Load3 P% a% R4 I W# S
RetainScrollPosition()* L6 Y$ I4 c0 P! W
End Sub % k" ]* [7 A, U0 L* [8 G1 z
% Y9 z$ p- ~: A' M Q3 j* B8 t# z3. DataList使用不同风格的模板
1 K1 y* l+ [9 `7 P1 O3 S 这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
& x5 d: y v' R9 d件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个 O+ p/ L: ~! G2 R3 L' U
元素或是加一个促销广告图等等。
3 B3 |( h3 o5 h3 g5 S) aDim theme As String/ e; d1 g0 ~5 I; A' @5 _2 ?
theme = DropDownList1.SelectedValue
( R: c2 U/ u3 C, S* zDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool% W, S! l! B$ c
DataList1.DataSource = DS, l! ]9 s9 K& W% |) m6 @& D
DataList1.DataBind()
' f1 C. A5 f+ I0 r 4. 设置服务器端控件的焦点: X9 d+ I* B1 a. B$ F
Private Sub SetFocus(ByVal controlToFocus As Control). S5 v/ t& W1 \/ w8 N: S
Dim scriptFunction As New StringBuilder/ L+ X# ^1 F2 B! V! Z. y
Dim scriptClientId As String
' D5 e4 e" ] F) N# N2 SscriptClientId = controlToFocus.ClientID- Z$ J z9 `# F& h7 O. V
scriptFunction.Append("<script language='javascript'>")
0 y; D# }& F( m! }0 z+ O2 PscriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
4 `" {! D3 {: Y. l( G* NscriptFunction.Append("</script>")( y( b3 y( S0 I8 v
RegisterStartupScript("focus", scriptFunction.ToString())" j/ j! \; P) l, m
End Sub7 j8 `" R: e2 M0 J" C
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles # [1 U/ W4 T! u3 }5 y( {
MyBase.Load
" J: M" [: {- f" `8 x& B* r& p- AIf (Page.IsPostBack = False) Then; H8 w7 S& l4 `0 o; d1 }% h. _: |
SetFocus(TextBox1)
' _7 @2 K; l$ `7 R7 lEnd If
0 f% Q. k/ B8 M+ a# TEnd Sub 1 P, D+ v5 w( Z3 {: O
5. 滚动DataGrid
0 S7 [6 l' U& [ 这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只
- ^* W2 M" L! A5 i有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控
. D" u" {- t! G3 f3 i件放在一个DIV中将overflow属性设置成auto
3 _2 H+ M6 x# a$ d<div style=“height:400px;width:200px;overflow:auto”>
% E7 S/ h5 v# ~) B<asp:datagrid id=“MyGrid” runat=“server”/>1 z; u8 e; h$ {% I, V' a, J0 M
</div>
! a/ C. R" [( L! F( b7 C5 w* W 6. 动态创建控件
$ u/ U3 @8 H$ O6 T: ^ 利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。
& [( x- @7 ^- a) Y' }! hSub Page_Load()
5 a$ _% u1 f0 w5 I) n# ^3 vDim i as Integer
6 |+ D2 S+ @% {9 V$ i- yFor i=0 to 4
9 o" s% j2 s, ~( G1 C/ gDim myUserControl as Control
( U/ S8 F; C0 }, dmyUserControl = Page.LoadControl(“foo.ascx”)/ |, }5 ~" L2 \ c0 o
PlaceHolder1.Controls.Add(myUserControl)
0 [3 ^& I) N+ r% l, FPlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
1 |4 q5 t) H: dNext i5 w7 l$ J# [" o- D4 X1 l+ U
End Sub q% ?* @3 X& [/ j
7. 客户端代码的使用
9 X; H: p. x* h, E ?; p. e- I 1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标6 d/ w7 l5 ]5 B# w
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性4 y+ x0 e/ F9 A
asp:ImageButton id=“foo”
9 ?0 _# R! ?7 {; UImageUrl=“start.jpg”
2 g- V) P ~# p7 p. i$ QonMouseOver=“rollover(this);” 1 Z; E. h& L. n7 y5 h+ D6 I
onMouseOut=“rollout(this)”! I/ G0 I; s4 b) G# v5 a8 v
rolloversrc=“myrollover.jpg”( W" }% e7 Y1 P& A w# `
rolloutsrc=“myrollout.jpg”
5 b4 [+ L/ v) ?$ J. `9 T; \8 f; krunat=“server”/>
, d e$ Q5 k. L6 o6 u<input type=Button onClick=“return clientHandler()” ' f0 c6 C) t$ s, b/ x. O0 m
onServerClick=“Button1_Click” … />
; f2 y- }0 d4 q 2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所+ N) U5 D% {' D4 Y0 `
有的客户端控件。/ ?8 `/ y. m7 Y$ J3 V1 J2 V
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 0 E7 J6 j: C* R% l0 T( d8 T% V! ^
MyBase.Load. [6 Y9 ^# A+ ^6 S( d* {
RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")( r6 l* o# q7 C. k+ h
End Sub
6 U. D* k: @3 i 3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术 |
|