飞翔无限fxwx.com广西经贸职业技术学院论坛

标题: [建站技术]七招制胜ASP.NET应用程序开发 [打印本页]

作者: 月中水    时间: 2009-10-16 01:25
标题: [建站技术]七招制胜ASP.NET应用程序开发
随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
/ [5 r4 V$ F, P! L, o求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。
7 k" f9 p; O7 f5 E  1. ~ 的用法
, k0 ]3 a% ~4 s+ ^; l  f  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方/ }3 a% H/ w* k3 W- @+ ]" S
式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不
# E! S/ S( e4 x+ v) j; N; H同层次的两个目录的aspx文件分别引用时,问题就会出现了。3 ~2 B0 H" v7 P
  ~/image/about.bmp
% ?2 x* V$ \' m是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更# ^& A/ h6 a6 d3 P6 |
加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
; Y, ~) Y( _8 E它。* @& b9 H6 K3 D4 c8 n6 z, y% \
  2. 在刷新和提交页面后,保存你的页面滚动条的位置
% r3 F8 u: r0 ~7 t  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说- c5 I( n. P3 u
用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸4 y* h* A% Y/ E2 m$ z+ G
组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方1 U( R% @6 c1 }1 z4 D
也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370- v, P8 e, [  G& y; m" V
个控件又需要他选择一下?
* p5 U! N% [8 B8 y, q8 D' a9 Z  用下面的方法可以很快地确定和记住你提交前的位置。
5 K' C4 i; O5 P2 ~& C  网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,
; O+ s8 x- S8 f) _不过他使用了Web Behavior这意味着你需要使用一个.htc文件. ~/ ?# [1 ?, q& z6 N9 V. {
Private Sub RetainScrollPosition()9 ]3 U' n  L  {* e& }; [
Dim saveScrollPosition As New StringBuilder, s/ U4 J  a" ~% D: t; R" K
Dim setScrollPosition As New StringBuilder
( n2 ^4 ]9 l) p& yRegisterHiddenField("__SCROLLPOS", "0")
; ?' L6 s$ n! j1 f" T. ksaveScrollPosition.Append("<script language='javascript'>")
/ q$ r9 T4 Z! L- bsaveScrollPosition.Append("function saveScrollPosition() {")
3 L' Z# C1 S$ M. R/ S0 [8 N8 TsaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")
7 ]6 o: n. d. E! e5 }& XsaveScrollPosition.Append("}")
8 G9 f  q: |9 d5 \( p6 Z% o. H1 {5 fsaveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")+ d" l0 ?* e5 y6 ?; l
saveScrollPosition.Append("</script>")8 ~8 D+ I+ ]& L. W! j! a! j# q
RegisterStartupScript("saveScroll", saveScrollPosition.ToString())
. e3 `" h" {! CIf (Page.IsPostBack = True) Then
  ^. H# {3 g! a2 csetScrollPosition.Append("<script language='javascript'>")0 J) u1 y$ y$ x
setScrollPosition.Append("function setScrollPosition() {")7 }" i8 g' k6 E, y0 N
setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")
# X& k* q) D) K, i1 K6 ]  y5 R7 jsetScrollPosition.Append("}")2 B- L% c7 m6 ?% L; [
setScrollPosition.Append("document.body.onload=setScrollPosition;")
% B6 e  Z8 A% bsetScrollPosition.Append("</script>")& u: K! K6 {- ?% p# _
RegisterStartupScript("setScroll", setScrollPosition.ToString()); \5 a$ ^! F- N* g7 L
End If
) U5 ]; {; P. ~8 U' |+ n' ZEnd Sub7 F% a& H$ [1 I& d4 c: I
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
$ \$ J* V/ T: LMyBase.Load
' g& a( |% u1 f, ~6 RRetainScrollPosition()
- p& U: w( k: m# uEnd Sub : S" P8 S+ o* T/ A
$ c' N) U# x- S3 g' |
3. DataList使用不同风格的模板
$ X9 F0 U# ^4 W  这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条7 @! c6 P0 C8 w0 m4 M
件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
4 R! d1 b7 H- s- a元素或是加一个促销广告图等等。
) M8 ]3 I5 p! ?9 g2 P4 n5 PDim theme As String$ Y" ^1 t* S) w0 @6 x& [
theme = DropDownList1.SelectedValue
, }6 \# P$ [0 |$ q" dDataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool7 S* b$ r' B) z
DataList1.DataSource = DS
1 b0 `, E' d. i% J0 _DataList1.DataBind() ! e) g8 j& K- ]
      4. 设置服务器端控件的焦点7 G& y: Y+ K7 F7 |
Private Sub SetFocus(ByVal controlToFocus As Control)
/ Q5 r8 C! ?6 h$ o" D+ UDim scriptFunction As New StringBuilder
; J1 s6 q6 b$ q9 yDim scriptClientId As String. v! g) f8 D1 A. r- E2 E
scriptClientId = controlToFocus.ClientID
. s# K# o; @- e& m5 SscriptFunction.Append("<script language='javascript'>")0 @+ W& l# P+ L$ |' ~
scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
7 P4 ]- I  C8 h! IscriptFunction.Append("</script>")% C  ?* C/ j  q8 f
RegisterStartupScript("focus", scriptFunction.ToString())
- Y$ B3 `. g+ K* HEnd Sub
* r* Q' E/ i' R( N9 w2 G# q2 oPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
2 A3 t- `! z9 a3 NMyBase.Load
+ j0 R4 r. E' e6 a. PIf (Page.IsPostBack = False) Then/ o; x0 z/ N- E& C9 C' ^
SetFocus(TextBox1)8 V1 J: c4 }; ?, R6 U
End If$ q) m9 {. b+ V8 _
End Sub . ]2 R$ b% O1 k) y+ G6 M
  5. 滚动DataGrid  F1 W4 o+ j6 }1 o9 T, I
  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只9 }0 m  S( H: N
有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控+ E( g; Q) e6 w; S( x, J+ F
件放在一个DIV中将overflow属性设置成auto
4 N% G% H' H5 N/ e/ N" j<div style=“height:400px;width:200px;overflow:auto”>7 y8 K) W6 a' m- X! l8 R9 `* I
<asp:datagrid id=“MyGrid” runat=“server”/>
% m/ C7 I+ k* F</div> 9 d, b$ G' D0 q' a3 @6 N
  6. 动态创建控件6 F4 ~7 [* s! o; N6 O/ Z
  利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。% W  p) i' J9 F! q: `; p
Sub Page_Load()
2 _4 ]( W" h0 b5 ^. y+ PDim i as Integer
  A2 Y. a2 t. d4 W' v, ?For i=0 to 4
$ e- b- `) _* n# ]Dim myUserControl as Control( A: O+ S4 l) P5 e6 F' ?3 d) ~/ [
myUserControl = Page.LoadControl(“foo.ascx”)
. u9 g3 o9 P& SPlaceHolder1.Controls.Add(myUserControl)" f$ \; Y; M3 w+ q' b; m, ]
PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
8 J4 _% u, M, ]) jNext i. @3 E7 ?( }0 }. q$ C8 ?3 o
End Sub + p" w% X  o% s7 N- w" `
  7. 客户端代码的使用
* o$ {3 R! u' q3 F$ v; n5 B2 o  1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标1 a: ]0 Y7 b, X
准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性
: k4 h1 X9 R2 B+ @7 |asp:ImageButton id=“foo”
% P/ S* g1 @4 K+ V8 H8 @! f" uImageUrl=“start.jpg”
1 [; ^: {/ b# @onMouseOver=“rollover(this);” ; t! j( V1 H2 A0 |. h
onMouseOut=“rollout(this)”: _5 H. L8 B; I* e( y9 r; S
rolloversrc=“myrollover.jpg”
- I5 W3 \# n6 b, t( Mrolloutsrc=“myrollout.jpg”2 s) S1 K- ?+ ^/ l
runat=“server”/>7 @5 @/ Z) A4 X2 o8 n
<input type=Button onClick=“return clientHandler()”
/ a  [) s3 X$ w# Z# J* Z( o! g; ?onServerClick=“Button1_Click” … /> " I1 O. P9 }. o3 e' j
  2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所) p* c, e( D" u& E! ?: p
有的客户端控件。
: L# J, x7 F0 V4 a4 [4 X7 K7 sPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles * @# m5 E& F) {2 X) |/ J
MyBase.Load
/ Z- o' P0 I7 l: J! ?2 | RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")) L0 G( I) R" v/ L& q* j
End Sub # E& j8 w, |8 E7 v' F
  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术




欢迎光临 飞翔无限fxwx.com广西经贸职业技术学院论坛 (http://gxjmbbs.com/) Powered by Discuz! X3.2