ASP.NET Note

本網頁以打造無障礙閱讀為目標,可以用任何瀏覽器來觀看本網頁


.NET Framework

. NET 是微軟繼其 DNA(Distributed interNet Applications) 架構之後,所提出下一代的分散式軟體應用架構,它的發展方向是要建構一個使用網際網路開放標準 ( 如: HTTP 、 XML 、 SOAP… 等 ) 的應用程式開發與執行的環境,使任何人從任何地方,在任何時間使用任何裝置都能存取網際網路上得資源與服務。

在微軟的規劃下,.NET 包含了五大發展的主軸

要瞭解.NET 的Framework可從簡化的高階結構來看

眾多的語言與開發工具,例如 VB, C#, J#, C++

基礎類別程式庫(Base Class Library ; BCL)

共通語言執行環境(Common Language Runtime ; CLR)

.NET應用程式有2大類

安裝

  1. 對於WinXP作業系統,必須先安裝好IIS,且IIS中還必須安裝 FrontPage 2000 Server Extensions 這項子元件。
  2. 然後安裝以下的.NET Framework
僅開發 僅執行 安裝套件
V V Microsoft Data Access Components 2.8 SP1版
若為XPSp2之前的版本,最好先安裝這個存取元件
V V Microsoft .NET Framework 2.0 版可轉散發套件 (x86)
V V Microsoft .NET Framework 2.0 版繁體中文語言套件 (x86)
.NET Framework 語言套件包含英文以外其他語言的翻譯文字 (例如錯誤訊息)。若未安裝語言套件,則會以預設的英文顯示這些訊息。
V   Microsoft .NET Framework 2.0 軟體開發套件 (SDK) (x86)

若需要執行J#, 則要另外安裝下列套件

Microsoft Visual J# .NET可轉散發套件 1.1 版
Microsoft Visual J# .NET可轉散發繁體中文語言套件 1.1 版

開發工具

Visual Web Developer 2005 Express Edition(VWD)

Visual Web Developer 2005 Express Edition 提供開始使用 ASP.NET 2.0 建立 Web 應用程式所需的工具。以程式碼後置(CodeBehind)的概念將畫面與程式碼分離,以web form為例,aspx存放的是與畫面有關的html與server control,另外會產生一個同名的vb程式存放事件與邏輯,它提供了:

Microsoft ASP.NET Web Matrix

Web Matrix 是微軟完全以c#實作出來的Windows Form(Client-Side UI)的網頁程式IDE開發工具,雖然使用介面類似Visual Studio.NET但實際是以嵌入式(Embedded)的概念來表現,其程式碼與畫面放在同一個檔案內(CodeInline)。Web Matrix是一個”Community Project”,使用者可以透過線上社群的討論方式,針對感興趣的項目提出問題與回應,可惜的是中文的支援度不佳 。

Web Matrix與Visual Studio.NET尚有若干差異:
1. Web Matrix應用程式不是以專案型式開啟,檔案間各自獨立。
2. Web Matrix的程式撰寫區不提供Intellisense的屬性提示窗格。
3. Web Matrix檔案無法自動編譯成DLL,而須透過Command Line自行編譯。
4. Web Matrix IDE提供.NET Framework Class Library屬性查詢視窗與線上討論區連結。
5. Web Matrix程式免費下載與使用。

#develop

#develop (唸成「 Sharp Develop」) 是一套遵循GPL授權的自由軟體,可在微軟的.NET平台上編寫C#與VB.NET的程式

Mono

共通語言執行環境(Common Language Runtime;CLR)

傳統的程式編譯方式是將原始程式碼直接編譯成電腦能直接執行的原生碼 (Native Code) ,以執行檔的形式儲存,但是這樣會發生某台機器上編譯過的可執行檔在另一台機器不能正常執行。

而在 .NET Framework 環境下,CLR(共通語言執行環境) 為.NET應用程式提供了一個跨平台的執行環境,一個 .NET 應用程式的原始碼會先透過 IL (Intermediate Language) 編譯器編譯,如果沒有語法上的錯誤,就會被加上 Metadata 引擎所產生的 Metadata ,與原始碼產生的中介語言 (Intermediate Language , IL) ,一起放在目的格式檔案中,通常是指可執行檔 (EXE) 或是動態連接檔 (DLL) ,也稱為組件(Assembly)或PE,但是這並不是真正可以直接由CPU執行的檔案,因為IL編譯器只是將原始程式碼編譯成一個中間碼,我們稱為MSIL (Microsoft Intermediate Language),這種IL必須再經過第二次編譯後才會產生真正可以由CPU執行的執行檔,同時如果在編譯過程需要用到其他程式庫,中間會再經過一個連結程式 (Linker) 來完成組合程式碼的動作。

實際執行時,CLR會啟動一個即時編譯器 (Just In Time Compiler , JIT Compiler) ,將執行檔中的中介語言轉換成原生碼並交由作業系統執行。如此,不論是使用那一種支援 .NET 程式語言撰寫的程式,所產生的中介語言皆相同。將此中介程式碼放置於已安裝 Microsoft .NET Framework 的電腦上均可正常執行而不論考慮作業系統或硬體的不同。

CLR除了負責上述執行程式之外,還要提供記憶體管理、執行緒管理 (thread management)、安全管理、版本管理、例外處理、與生命週期監督等核心服務。

Metadata

在組件中除了IL code之外,還包含了一份Metadata,所謂的Metadata指的是用來描述該Assembly的資訊,例如版本、程式內所包含或引用的類別、記憶體資源的配置、 IL 編譯成原生碼所需的資訊及安全管理…等,因此只要一個Assembly就可以包含所有需要的程式、資源、以及自我描述資訊,也就是說Assembly不再需要如同COM元件一樣必須在系統登錄 (Registry) 中註冊,避免了DLL Hell的情形。

與Java的比較

共通型別系統(Common Type System ; CTS)

物件儲存位置

物件可能儲存在記憶體的兩塊區域:Managed Heap以及Stack

共通語言規範(Common Language Specification ; CLS)

基礎類別程式庫(Base Class Library)

.NET Framework 包含了一組豐富的類別庫讓程式設計人員使用 ,包含

C#

標準

VB.NET

因為ASP.NET可與許多語言作搭配,而大多數的人選擇的都是VB.NET,所以有必要深入瞭解一下

事件驅動(event driven)

要解釋什麼是事件驅動模型,請先看以下控制按鈕的範例程式

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
    Select Case sender.text
        Case "新增"
            Response.Write("新增")
        Case "修改"
            Response.Write("修改")
        Case "刪除"
            Response.Write("刪除")
    End Select
End Sub

針對上述函式的簽名(Signature)解釋如下
sender As System.Object
sender 代表觸發此事件的物件,且為Object資料型態
e As System.EventArgs
e 代表觸發此事件時所傳進來的參數,資料型態則依照事件而有所不同,通常為EventArgs型態
Handles Button1.Click......
代表此函式可由 Button1....等物件的 Click事件所觸發

Structure

利用Structure,可以建立類似物件的資料結構而成為一種DataType

Public Structure Employee
    Dim Name As String
    Dim IdNo As String
    Dim TelNo As String
    Dim Salary As Double
    Dim Bonus As Double
    Friend Sub CalculateBonus(ByVal Rate As Single)
        Bonus = Salary * Rate
    End Sub
End Structure

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
   Dim David As Employee
   David.Name = 'David'
   David.Salary = 35000
   David.CalculateBonus(0.01)
   Response.Write(David.Name & "的獎金為:" & David.Bonus)
End Sub

VB6的內建函數

  1. 命名空間:Microsoft.VisualBasic
  2. 範例:Microsoft.VisualBasic.Rnd()

ASP.NET

環境建置

正式的網站環境

  1. Windows 2003 Server
  2. IIS6.0 (要在.NET Framework 2.0 安裝前設定好),建議附加下列子元件
    1. FrontPage 2000 Server Extensions
    2. SMTP Service
    3. FTP Service
  3. .NET Framework 2.0 版可轉散發套件
  4. SQL Server 2000 / 2005
  5. Windows Update

建議的開發環境

  1. XP
  2. .NET Framework 2.0 軟體開發套件 (SDK)
  3. Visual Web Developer 2005 Express (內附 SQL 2005 Express 與 ASP.NET程式開發伺服器)
  4. Windows Update
  5. 可選擇安裝軟體
    1. IIS5.0 (IIS要在.NET Framework 2.0 安裝前設定好),建議附加元件與正式環境相同
    2. SQL Server 2000 MSDE版本 或 Access 2003

也可這麼看,正式的網站環境無須安裝VWD2005,開發環境則不一定要安裝IIS或MSDE或Access資料庫。

Visual Web Developer 2005 Express Edition

     Visual Web Developer 2005(VWD2005) Express為Visual Studio 2005(VS2005)的子集合,是微軟近來提出與LAMP陣營相當的開發工具,使用拖放元件的方式即可設計Web應用程式,並支援互動式的除錯方式。內含免費精簡版的web伺服器(development server)與資料庫(sql 2005 express server)可供本機測試使用,實際上部署時仍須搭配IIS與SQL Server。

VWD操作練習

小技巧

  1. Web Form上任何空白的地方 Double Click,就會跳到 Code Behind的設計畫面
  2. 在CodeBehind的設計畫面中使用 Me. 可帶出所有可使用的物件名稱
  3. 畫面設計上想要動態的增加顯示內容可使用 Label Literal,差別在於 Label 物件一定佔據版面空間,且可以事先決定大小,而Literal物件若不顯示則不佔版面空間,且可以使用 html語法來顯示其大小與內容

ASP.NET vs. ASP

ASP.NET並不是ASP 4.0。無論就整個網頁的執行架構,或是撰寫程式使用的程式語言,及程式的設計概念,兩者自本質上就完全不同。ASP.NET已經徹頭徹尾地改寫了!

如何將混和模式轉變為程式碼後置模式

將程式碼開頭的宣告修改如下,並將<script runat="server">與</script>之間的程式拿掉放到list.aspx.vb

list.aspx
<%@ Page Language="VB" debug="True" Explicit="True" Strict="True" Src="list.aspx.vb" inherits="peter.myvb" %>
<html>
<body>
....略 ...
</html>

list.aspx.vb
Imports System
Imports System.Data
Imports System.Data.SqlClient

Namespace peter
  Public Class myvb : inherits System.Web.UI.Page
     Protected WithEvents Repeater1 As System.Web.UI.WebControls.Repeater
     Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
           Dim cnn As SqlConnection = New SqlConnection("server=(local);database=roam;uid='sa';pwd='591026';")
           Dim cmd1 As SqlDataAdapter = New SqlDataAdapter("select * from j05 where schyy='93'", cnn)
           Dim ds As DataSet = New DataSet()
           cmd1.Fill(ds,"j05") '也可這樣寫 cmd1.Fill(ds)
           Repeater1.DataSource = ds.Tables("j05") '也可這樣寫 Repeater1.DataSource = ds
           Page.DataBind() '也可這樣寫 Repeater1.DataBind()
           cnn.Close()
     End Sub
  End Class
End Namespace

@ Page

這個指示詞只能使用於 Web Form 網頁中 (.aspx 檔案)。您只能在每一個 .aspx 檔案中包含一個 @ Page 指示詞,以下建議常用的屬性。(http://msdn.microsoft.com/library/cht/default.asp?url=/library/CHT/cpgenref/html/cpconPage.asp)

<%@ Page Language="VB" debug="True" Explicit="True" Strict="True" inherits="my.myCodeBehind" Codebehind="aa.aspx.vb" %>

Language
指定編譯網頁內所有內嵌轉譯 (<% %><%= %>) 和程式碼宣告區塊時使用的語言。這些值可以代表任何 .NET 支援的語言,包括 Visual Basic、C# 或 JScript .NET。
Debug
指示網頁是否應使用偵錯符號編譯。如果網頁應使用偵錯符號編譯,則為 true;否則為 false
Inherits
定義網頁要繼承的程式碼後置 (Code-Behind) 類別。這可以是從 Page 類別衍生的任何類別。
AutoEventWireup
指示網頁的事件是否自動觸發,預設值是 true。若為false則所有頁面事件必須經過用戶明確的操作才能觸發。
Codebehind
這個屬性是由 Visual Studio .NET Web Form 設計工具所使用。它會將網頁類別的位置告訴設計工具,使設計工具可以建立該類別的執行個體,供您在設計階段使用。
Src
指定當要求網頁時,以動態方式編譯之程式碼後置類別的原始程式檔 (Source File) 名稱。
注意
RAD 設計工具 (例如 Visual Studio. NET) 不使用這個屬性。相反地,它們會預先編譯程式碼後置類別,然後使用 Inherits 屬性。
SmartNavigation
指示網頁是否支援 Internet Explorer 5.5 (含) 以後版本中的智慧型巡覽。
Explicit
判斷網頁是不是使用 Visual Basic 的 Option Explicit 模式編譯的。true 指示 Visual Basic 的明確編譯選項已啟用,而且所有變數都必須使用 DimPrivatePublicReDim 陳述式宣告;否則為 false。預設為 false
注意
除了 Visual Basic .NET 以外的語言都會忽略這個屬性。
Strict
指示是否應使用 Visual Basic Option Strict 模式編譯網頁。如果已啟用 Option Strict,則為 true;否則為 false。預設為 false
注意 除了 Visual Basic .NET 以外的語言都會忽略這個屬性。
Trace
指示是否已啟用追蹤。如果已啟用追蹤,則為 true;否則為 false。預設為 false

智慧型巡覽

智慧型巡覽是 ASP.NET 中的一項功能,Internet Explorer 5.5 (含) 以後版本的瀏覽器都支援這項功能。它讓網頁在不同巡覽之間進行重新整理時,仍能維持捲動位置和項目焦點 (Focus),只將單一網頁儲存在瀏覽器的記錄中,而且沒有一般重新整理 Web 網頁時所出現的閃動現象。智慧型巡覽最適合與需要時常回傳、但傳回的視覺內容並無劇烈變更的 ASP.NET 網頁搭配使用。決定是否將這個屬性設定為 true 時,請仔細考慮這一點。

Server Control

server control是什麼?

server control 是 .NET Framework所提供web程式撰寫時所需的控制項, 有 HTML Controls 與 WEB Controls 兩大類

HTML Controls 與 WEB Controls 的異同?

使用server control的時機

第一次使用 server control 會有的疑問是:我是否應該將所有前端的 html 都代換成 server control , 正確的答案是:你應該只將需要互動而產生變化的前端瀏覽器物件改寫成為 server control 或是說應該將會寫程式與之互動的前端瀏覽器物件改寫成為server control。

使用server control來替代傳統client端使用javascript有什麼好處?

傳統web程式因為http stateless的緣故必須使用與server端不同的程式語言如 javascript 來針對client端瀏覽器上的物件加以控制,也因此在面對前端瀏覽器的平台不一致時 (etc. mozilla, opera, packet pc) 針對不同廠牌、版本的瀏覽器撰寫數個不同 的版本的網頁內容。

server control 就是 .Net Framework 所提出解決上述問題的 soloution , web 開發人員能以與server端相同的程式語言來撰寫與client端使用者互動的處理程序,而不需要考慮 client 端的瀏覽器平台,而 .Net 則 會根據使用者的瀏覽器類型動態地產生適合的HTML網頁、WML手機畫面、 javascript 程式碼等,對於web開發人員而言可以減輕相當大的負擔。

一些未解的疑問

  1. 在ASP.NET中使用C++或C#的執行效率是否較VB要來的好呢?書上都說轉成managed code 所以沒差,但是不同語言在compile成managed code時難道也沒有差異嗎 ?
  2. 雖然說.Net 號稱可以在Server處理掉許多在client端需要作的事,簡化學習Javascript的困擾,但實際上程式設計師還是需要寫許多的javascript,並將之包在server端的程式碼中 ?

ASP.NET使用技巧

在asp.net如何使用 JavaScript 做到列印時隱藏按鈕

筆者介紹四種如何在asp.net引用 JavaScript 的作法:

1.直接在 xxx.aspx中加入javascript的code,傳統的asp, php也都是這樣直接控制的。但在asp.net中此類方式只適合在 javascript中沒有參考到任何 server control時使用。
<div id="MyPanel" align="center"> //請注意, 此處定義的是 html的 layer而非 webcontrol中的 Panel
    <asp:Button ID="printBtn" runat="Server" Text="列印" OnClick="PrintClick" />
</div>
<script language="javascript" type="text/javascript">
Function PrintClick(){
   var IE4 = (document.all) ? 1 : 0; //判斷執行的client端為何種瀏覽器
'   window.document.all.MyPanel.style.visibility='hidden' ;  //這種寫法只能使用在IE上
'要在列印前將按鈕隱藏,才不會將按鈕印出來,考慮到跨瀏覽器的相容性必須使用getElementByID()
   window.document.getElementById("MyPanel").style.visibility='hidden';
   window.print();
   window.document.getElementById("MyPanel").style.visibility = (IE4) ? 'visible' : 'show';  //IE4與NS4對於隱藏的layer要取消隱藏時的值不一樣
}
</script>
2.使用.Attributes.Add對printBtn加上OnClick的javascript code
請注意:server control 的名稱在 client端瀏覽器中對應的DOM物件名稱 有可能不一樣
<asp:Panel ID="MyPanel" runat="server" align="center">
         <asp:Button ID="printBtn" runat="Server" Text="列印" />
</asp:Panel>
Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs)
   Dim JavaScript As String
   JavaScript="JavaScript:"
   JavaScript+="var IE4 = (document.all) ? 1 : 0;" '判斷client端的瀏覽器是否為IE
   JavaScript+="window.document.getElementById('"+MyPanel.ClientID+"').style.visibility='hidden';" '隱藏Panel包起來的按鈕
   JavaScript+="window.print();"
   JavaScript+="window.document.getElementById('"+MyPanel.ClientID+"').style.visibility = (IE4) ? 'visible' : 'show';"  'IE4與NS4對於隱藏的layer要取消隱藏時的設定值不一樣

   printBtn.Attributes.Add("OnClick",JavaScript)
'   me.printBtn.Attributes("onclick") =JavaScript  //這樣寫也可以
End Sub
3.使用Page.RegisterClientScriptBlock,可在client端定義出獨立的 javascript function,供重複呼叫
請注意:server control 的名稱在 client端瀏覽器中對應的DOM物件名稱 有可能不一樣
<asp:Panel ID="MyPanel" runat="server" align="center">
         <asp:Button ID="printBtn" runat="Server" Text="列印" />
</asp:Panel>
Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs)
     printBtn.Attributes.Add("onclick","PrintClick();") //請記得要加分號,因為.net還會在這之後加上code
End Sub

Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
   Dim myScript AS StringBuilder = new StringBuilder() //除了使用 String定義,還可使用StringBuilder,可更節省記憶體
   myScript.Append(VbCrLf & "<script language='javascript' type='text/javascript'>")
   myScript.Append(VbCrLf & "function PrintClick(){")

'判斷client端的瀏覽器是否為IE
' myScript.Append("var NS4 = (document.layers) ? 1 : 0;") //這樣寫為判斷Nescape瀏覽器 , 但 mozilla不支援
   myScript.Append(VbCrLf & "var IE4 = (document.all) ? 1 : 0; ") //這樣寫為判斷IE瀏覽器 , 但 mozilla不支援

'因按鈕以MyPanel包起來, 所以列印時要將之隱藏, 但因為使用了webcontrol而無法得知執行時的client端ID,所以不可單純以MyPanel表示,而要加上.ClientID
   myScript.Append(VbCrLf & "window.document.getElementById('"+MyPanel.ClientID+"').style.visibility='hidden';")
   myScript.Append(VbCrLf & "window.print();")

 'IE4與NS4對於隱藏的layer要取消隱藏時的設定值不一樣
   myScript.Append(VbCrLf & "window.document.getElementById('"+MyPanel.ClientID+"').style.visibility = (IE4) ? 'visible' : 'show';")
   myScript.Append("}")
   myScript.Append(VbCrLf & "</" & "script>")

   Page.RegisterClientScriptBlock("MyScript", myScript.ToString())
End Sub

4.使用literal來安插 javascript code到指定的位置
<asp:Panel ID="MyPanel" runat="server" align="center">
         <asp:Button ID="printBtn" runat="Server" Text="列印" />
</asp:Panel>
<asp:literal id="Literal1" runat="server"></asp:literal>
Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs)
   Dim JavaScript As String
   JavaScript=vbCrLf & "<script language='javascript' type='text/javascript'>"
   JavaScript+=vbCrLf & "function PrintClick(){"
   JavaScript+=vbCrLf & "var IE4 = (document.all) ? 1 : 0;"
   JavaScript+=vbCrLf & "window.document.getElementById('"+MyPanel.ClientID+"').style.visibility='hidden';"
   JavaScript+=vbCrLf & "window.print();"
   JavaScript+=vbCrLf & "window.document.getElementById('"+MyPanel.ClientID+"').style.visibility = (IE4) ? 'visible' : 'show';"
   JavaScript+=vbCrLf & "}"
   JavaScript+=vbCrLf & "</script>"

   me.Literal1.Text = Javascript
End Sub

網頁載入後讓游標停留在指定的欄位上

使用Page.RegisterStartupScript,可在client端網頁底部放置javascript code,其目的在確保所有呼叫的網頁物件皆已存在

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
   SetFocus(TextBox1)
End Sub

Sub SetFocus(ByVal controlToFocus As Control)
   Dim JavaScript As New StringBuilder()
   JavaScript.Append(VbCrLf & "<script language='javascript'>")
   JavaScript.Append(VbCrLf & "window.document.getElementById('")
   JavaScript.Append(controlToFocus.ClientID)
   JavaScript.Append("').focus();")
   JavaScript.Append(VbCrLf & "</" & "script>")
   Page.RegisterStartupScript("focus", JavaScript.ToString())
End Sub

ADO.NET

Java Framework VS .NET Framework

J2EE Feature .NET Framework 備註
Java Multi-language Cobol, Build into SQL Server
JVM CLR  
JDK .NET Framework SDK  
JavaBeans .NET class  
EJB .NET class with COM+  
JSP/Servlet ASP.NET Web control vs. Taglib and Faces
JMS System.Messaging / MSMQ  
EJB Message Beans COM+ QC  
JNLP (WebStart) No-touch Deployment  
RMI-over-IIOP .NET Remoting  
JNDI ADSI  
JAXP … System.XML and web services ADO.NET XMLReader
JSR-175 – coming in JDK 1.5 Code Attributes  
JavaMail System.Web.Mail  

參考資料:http://www.iiiedu.org.tw/knowledge/knowledge20020828_2.htm

參考書目

網路資源

ECMA International

ECMA International(ECMA)創立於1961年,發展出資訊和通訊技術標準(ICT)。ECMA是非營利業界組織,由技術開發人員、廠商和使用者共同組成。業界和其他專家在ECMA組織中共同協力合作,完成各項標準的制訂。接著ECMA將獲得許可的新技術,提報送交ISO、ISO/IEC和ETSI標準的核可。

ECMA提供了「快速審核」,進入業界標準組織程序,透過這種管道,高品質的標準可以快速通過並獲得採行。 這些標準主要的領域包括:指令碼和程式語言,光學和磁性儲存裝置,高速互聯,安全、環境、音響和電磁產品特性,企業和Proximity Communication相鄰通訊和Networking,檔案和容量結構。相關出版品可免費網站下載: http://www.ecma-international.org

XML

XML是一種在 W3C 工業標準規範下的標示語言 (Markup Language) ,主要在描述結構化的資料,提供標準的資料交換格式,讓資訊能跨越異質的環境與不同的設備。

SOAP

SOAP(Simple Object Access Protocol)是一種架構在 HTTP 協定上的分散式物件通訊協定。透過 XML 讓使用者端與伺服器之間可以互相整合,讓應用程式之間可以跨越防火牆而達到彼此溝通的目的。

主 網 站:http://peterju.notlong.com (目前轉址至 http://irw.ncut.edu.tw/peterju/) Sitetag Logo

Level Triple-A conformance icon | [歡迎使用任何作業系統、瀏覽器觀看!] | Valid XHTML 1.0 Transitional | Valid CSS! | [Valid RSS] | [創意公眾許可証]
This work is licensed under a Creative Commons License