设为首页

广西经贸职业技术学院论坛

 忘记密码
 免费注册
查看: 1331|回复: 0
打印 上一主题 下一主题

[建站技术]七招制胜ASP.NET应用程序开发

[复制链接]
  • TA的每日心情

    2019-8-18 09:37
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    楼主
    发表于 2009-10-16 01:25:18 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    随着微软.NET的流行,ASP.NET越来越为广大开发人员所接受。作为ASP.NET的开发人员,我们不仅需要掌握其基 本的原理,更要多多实践,从实践中获取真正的开发本领。在我们的实际开发中,往往基本的原理满足不了开发需
    ) Z0 |4 H* I' A0 t5 T4 a求,我们更多的要积累一些开发技巧,本文就向大家介绍一些实用技巧,希望对大家的开发有所裨益。4 h' L" r! G/ O
      1. ~ 的用法
    2 d. {+ F0 d% m& g  一般的情况下,我们是使用./../ 这样的相对路径来确定和规划我们的资源(比如图片、资源文件),但这种方1 r, K0 ?1 o  h/ f+ a% [
    式下在我们部署应用的时候,可能会出错,另外对于.ascx的控件中如果包含了一个图片,而这个控件被我们在不$ ~7 ?, F+ C. f& k% a
    同层次的两个目录的aspx文件分别引用时,问题就会出现了。
    9 h( ^+ o. O8 c- P  ~/image/about.bmp # p7 `3 T. N: f" \2 N$ H
    是一种非常好的方法,它以Web应用程序的根目录为起始点,这样使得比你使用./image/about.bmp这样的方式要更+ m8 M. D+ K; W8 n
    加灵活和方便。有一点不好,是这种方式是在ASP.NET运行时动态解析的,所以在IDE设计模式中,你可能不能预览
    - U: U& E+ v0 W; d- z6 v# q它。
    ! h0 ^. B) S/ a  r/ ?) m  2. 在刷新和提交页面后,保存你的页面滚动条的位置
    ; F3 N' ]: ]8 u& ~  }9 |  经常有这样的情况,我们需要用户提交一个表单,但是表单中有超过500+个?控件或文本框要填写,也就是说/ i& M1 G  L2 e5 q/ s
    用户需要拉动IE的滚动条才能够填得完,那么假如用户正在可见IE范围的2/3处,选择了一个组合框的值,很不幸6 U# V: C$ V5 ~1 i4 s1 e% p9 B
    组合框是服务器端的,那么也就意味着页面会提交一次,而当用户再看见刷新过的页面时,页面确定在3/1的地方
    ' ]) C( l- _4 y/ B/ |也就是显示在页面最开始的地方,用户只有拖动鼠标,然后接着刚刚的地方再填写剩下的250个控件,很不幸,370  r! A. w4 U6 x& o! m, r  ^0 H% n
    个控件又需要他选择一下?
    1 I- m; P5 B+ f8 w7 v9 [  用下面的方法可以很快地确定和记住你提交前的位置。: L' k' V; E, [8 f% D2 V8 D
      网上的Old Dog Learns New Tricks也有一个类似的例子Maintain Scroll Position in any Page Element,( d# C) x1 S4 W* Z4 w4 \: y* n
    不过他使用了Web Behavior这意味着你需要使用一个.htc文件! g* u5 D1 d/ h
    Private Sub RetainScrollPosition()
    " ]6 Q- _+ L, d% u+ y" c" ?" BDim saveScrollPosition As New StringBuilder
    0 S+ ~- _. m# C! B( f( oDim setScrollPosition As New StringBuilder
    & R  m1 |& V# Y# q& M% S2 O2 @RegisterHiddenField("__SCROLLPOS", "0"): a: |1 n+ d+ T' K; b9 z# W
    saveScrollPosition.Append("<script language='javascript'>")3 T9 D, P8 f$ k4 N( J7 z
    saveScrollPosition.Append("function saveScrollPosition() {")
    6 H# R( W1 W4 H* K$ n! R" t# csaveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = document.body.scrollTop;")- \$ s1 e+ s* s3 B7 Z9 Q" [" H
    saveScrollPosition.Append("}")  w% Y7 E* X& D% W9 O+ g& ~+ ?
    saveScrollPosition.Append("document.body.onscroll=saveScrollPosition;")
    ; Y/ P# V6 Z' v. nsaveScrollPosition.Append("</script>")* y& k0 Q& M/ b4 Q7 h0 T3 m$ ?7 S# g
    RegisterStartupScript("saveScroll", saveScrollPosition.ToString())# B  e) X: A, E! t" c' C
    If (Page.IsPostBack = True) Then
    / v) y) f" N' a- y* ^4 R# s  D2 v, hsetScrollPosition.Append("<script language='javascript'>")2 y5 m, ?% v' w6 t' _- j* p. V
    setScrollPosition.Append("function setScrollPosition() {")% F  p7 K/ }, v! r' Z2 ^4 g
    setScrollPosition.Append(" document.body.scrollTop = " & Request("__SCROLLPOS") & ";")3 t5 O$ @! m6 R0 y  ^
    setScrollPosition.Append("}")0 \& L0 v9 a6 G% h6 `( J/ a% c
    setScrollPosition.Append("document.body.onload=setScrollPosition;"). ]$ @8 }2 C" S) _
    setScrollPosition.Append("</script>")
    ; I& P0 E7 g5 s6 d- wRegisterStartupScript("setScroll", setScrollPosition.ToString())( n% v$ F  T- ~+ {6 I
    End If
    , M& O+ S) I( a* w$ K" ?- ^% zEnd Sub  W- O) q  Z) ~1 O
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles " N' M- x+ e" X+ Q' {, L% D
    MyBase.Load1 l  t0 B- Q* _# a; q) v2 l4 F
    RetainScrollPosition()$ d, J3 N4 m3 k: n: Q9 V8 ]( j% o3 o
    End Sub 6 g4 V7 \6 e7 |. N) G2 O
    3 s, Q* v) X  \3 ^2 O7 K8 ]# c
    3. DataList使用不同风格的模板, g* q6 H" v2 i, p; R1 T1 }6 r
      这招也非常实用,你可以制作两个不同的模板或表现形式,分别以.ascx控件的形式保存,运行时根据某个条
    ) j5 n6 ^1 v' H, j! p件动态的选择使用其中的一个模板,另外ScottGu认为ItemDataBound方法也可以定制你显示的表现,比如加亮某个
    ; d9 i/ v: h. h* X, R0 ~2 _# V9 Z7 N元素或是加一个促销广告图等等。
    . h- o; X$ O9 l* `2 O# `Dim theme As String  r% p1 l3 \$ K
    theme = DropDownList1.SelectedValue* o5 J8 _; J5 w1 h, P6 V
    DataList1.ItemTemplate = Page.LoadTemplate(theme & ".ascx") ---Cool. H2 {+ m6 h/ r
    DataList1.DataSource = DS
    / A- V) e3 `' B; o- ~; J* p! |DataList1.DataBind() ! |5 `) B' f5 ~0 e5 k( K
          4. 设置服务器端控件的焦点0 L+ T& ?) d' c! \& O; G
    Private Sub SetFocus(ByVal controlToFocus As Control)( M9 g4 E( t/ J4 c# K: l
    Dim scriptFunction As New StringBuilder
    0 F1 s, w$ T4 C2 F9 FDim scriptClientId As String
    - u8 d/ e0 V+ W. Q. t4 PscriptClientId = controlToFocus.ClientID
    * M: _, d3 d4 s; v+ n4 WscriptFunction.Append("<script language='javascript'>")* P: ?5 x# O7 |5 i* L# E0 ^
    scriptFunction.Append("document.getElementById('" & scriptClientId & "').focus();")
    # a6 ]- `/ ^/ b' ~' n' b& F3 t+ e& @scriptFunction.Append("</script>")* R5 {+ G3 {& u5 R- O
    RegisterStartupScript("focus", scriptFunction.ToString()). H7 Y  w9 b7 T7 L$ Z
    End Sub
    + w& X: j: ^7 C4 r& T$ HPrivate Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
    & w9 F5 g" f' k( S& Q) ~MyBase.Load
    - c$ ]$ _, y, K1 d, rIf (Page.IsPostBack = False) Then# L& ]  ^3 P  p7 c8 I+ H" s
    SetFocus(TextBox1)3 ^, v5 K. p/ Q/ l9 N2 H
    End If
    : h" F' Z6 W, n, U  tEnd Sub
    4 ~3 \; K9 J3 v  5. 滚动DataGrid
    " L/ L/ Z  ~5 _$ x0 O5 t' U, E- m  这招就更简单了,有时候你的页面只有一个固定的地方,但是需要显示非常多的数据,亦或是也不定,但是只! q( o9 Y& C. O4 I
    有固定的一个地方给你显示它了。这时你就可以用下面这招,自动出滚动条,而且适用许多控件。很简单将你的控/ A1 p5 U" v! g* I
    件放在一个DIV中将overflow属性设置成auto
    6 a9 u9 K2 g3 c6 u<div style=“height:400px;width:200px;overflow:auto”>. h, x6 K+ y9 |0 T( Z5 j3 X) N0 i
    <asp:datagrid id=“MyGrid” runat=“server”/>4 o) D* \4 J; N; ?8 N8 B" q5 o
    </div> 3 E+ y  f% C, o0 ~5 [  l
      6. 动态创建控件  ?. A: N/ k* R3 d: M# X( z' z
      利用PlaceHolder控件,这东西在ASP.NET 2.0 Mutil-View和Master Page中运用的就更加多了。  `* R0 X8 |2 n  c$ V' t
    Sub Page_Load()
    , J! `) ^$ h; eDim i as Integer
      ]  [. [) T7 E  D# s# vFor i=0 to 4 " s8 \  J/ U( ?6 n0 I4 j
    Dim myUserControl as Control5 {* |' Z- ^3 |8 M4 S; B( E
    myUserControl = Page.LoadControl(“foo.ascx”); }) _9 Q, k* v) `  E" _
    PlaceHolder1.Controls.Add(myUserControl)2 s% D) [: v& i0 z8 T( S. D" i
    PlaceHolder1.Controls.Add(New LiteralControl(“<br>”))
    ' W7 ^, H) H! s3 a3 S1 @Next i
    - J0 p# Y: x: g4 w7 i  R' c2 dEnd Sub # S0 q4 Y( g$ ~2 b. @2 V  y5 A3 {+ T2 y
      7. 客户端代码的使用% d1 r  ?+ N! D" Q- ]% I- R
      1). 可以使用客户端的事件代码,但两者不能同名,服务器端代码的名是你可以控制的。对于非ASP.NET的标1 L% {8 l, l1 Q& l6 _- s& U
    准控件的自定义控件必须实现IAttributeAccessor接口或从WebControl派生并且可用expando属性2 l* w3 Y6 G6 L4 A0 Y' X. r: d  e9 u8 G
    asp:ImageButton id=“foo” " x" M5 H9 l: @& E) J7 Y$ ]2 [
    ImageUrl=“start.jpg”- l8 |7 Z; R) \% F' k
    onMouseOver=“rollover(this);” . t$ G2 `0 Y3 Z
    onMouseOut=“rollout(this)”, _& Y) q! B. n/ l- u0 n, z2 t
    rolloversrc=“myrollover.jpg”
    + p# ]1 O! ]& Q" b5 `, irolloutsrc=“myrollout.jpg”
    5 Q0 b; |6 E* r- H* qrunat=“server”/>
    & Z4 |5 Y3 e: t0 k* `6 v2 Y( m4 h& U<input type=Button onClick=“return clientHandler()”
    6 H9 ^+ D: i0 _onServerClick=“Button1_Click” … /> 2 a  {" }& `& v* R, z0 q
      2). 使用可以在Postback之前执行客户端代码,当然也可以取消这次Postback,另外也可以访问客户端该页所$ O, p7 P  E5 T, ]/ [" B
    有的客户端控件。3 l% c  l" |  u7 Y: n8 @
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)  Handles % f# F1 Q0 B* L
    MyBase.Load
    ! }) {7 b3 Y. m" p% v! X2 [% ~2 d) } RegisterOnSubmitStatement("foo", "return confirm('Are you sure you want to submit the order?');")
    , K% G% q2 C8 u# r8 V' qEnd Sub
    ) p( n& C# N- j) k  3). 还有更复杂的我认为不实用,大家可以自己去看,主要是运用RegisterStartupScript和JavaScript的技术
    常上飞翔,梦想飞扬!经贸是我家,建设靠大家~ 人们都说:不在大学论坛里灌过水的大学都像是没读过大学~
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    QQ|版主考核中心|『经贸在线』 ( 桂ICP备15001539号-2  

    GMT+8, 2025-9-17 23:38

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表