1. 程式人生 > >ASP.NET入門教程(經典)

ASP.NET入門教程(經典)

1 ASP.NET簡介

1.1 什麼是ASP.net

ASP.net 是一種建立在通用語言上的程式構架,能被用於一臺Web伺服器來建立強大的Web應用程式。ASP.net提供許多比現在的Web開發模式強大的的優勢。

 執行效率的大幅提高

ASP.net是把基於通用語言的程式在伺服器上執行。不像以前的ASP即時解釋程式,而是將程式在伺服器端首次執行時進行編譯,這樣的執行效果,當然比一條一條的解釋強很多。

 世界級的工具支援

ASP.net構架是可以用Microsoft®公司最新的產品 Visual Studio.net開發環境進行開發,WYSIWYG(What You See Is What You Get所見即為所得)的編輯。這些僅是ASP.net強大化軟體支援的一小部分。

 強大性和適應性

因為ASP.net是基於通用語言的編譯執行的程式,所以它的強大性和適應性,可以使它執行在Web應用軟體開發者的幾乎全部的平臺上(筆者到現在為止只知道它只能用在Windows 2000 Server上)。通用語言的基本庫,訊息機制,資料介面的處理都能無縫的整合到ASP.net的Web應用中。ASP.net同時也是language-independent語言獨立化的,所以,你可以選擇一種最適合你的語言來編寫你的程式,或者把你的程式用很多種語言來寫,現在已經支援的有C#(C++和Java的結合體),VB,Jscript。將來,這樣的多種程式語言協同工作的能力保護您現在的基於COM+開發的程式,能夠完整的移植向ASP.net。

簡單性和易學性

ASP.net是執行一些很平常的任務如表單的提交客戶端的身份驗證、分佈系統和網站配置變得非常簡單。例如ASP.net頁面構架允許你建立你自己的使用者分介面,使其不同於常見的VB-Like介面。另外,通用語言簡化開發使把程式碼結合成軟體簡單的就像裝配電腦。

 高效可管理性

ASP.net使用一種字元基礎的,分級的配置系統,使你伺服器環境和應用程式的設定更加簡單。因為配置資訊都儲存在簡單文字中,新的設定有可能都不需要啟動本地的管理員工具就可以實現。這種被稱為"Zero Local Administration"的哲學觀念使Asp.net的基於應用的開發更加具體,和快捷。一個ASP.net的應用程式在一臺伺服器系統的安裝只需要簡單的拷貝一些必須得檔案,不需要系統的重新啟動,一切就是這麼簡單。

多處理器環境的可靠性

ASP.net已經被刻意設計成為一種可以用於多處理器的開發工具,它在多處理器的環境下用特殊的無縫連線技術,將很大的提高執行速度。即使你現在的ASP.net應用軟體是為一個處理器開發的,將來多處理器執行時不需要任何改變都能提高他們的效能,但現在的ASP確做不到這一點。

自定義性,和可擴充套件性

ASP.net設計時考慮了讓網站開發人員可以在自己的程式碼中自己定義"plug-in"的模組。這與原來的包含關係不同,ASP.net可以加入自己定義的如何元件。網站程式的開發從來沒有這麼簡單過。

安全性

基於Windows認證技術和每應用程式配置,你可以確性你的原程式時絕對安全的。(但是Asp的經驗告訴我們,不能這麼自信,M$老是會出Bug的)

1.2 本篇教程的主要內容

 ASP.net 的語法

ASP.net 的語法有可能對老的ASP程式設計師來說很熟悉,但也有一些是全新的東西,QuickStart教程將在細節上全部談到它們。

ASP.net 的結構和特徵

介紹ASP.net的所有特性,是ASP開發者可以編寫互動性的世界級的應用軟體,用比以前少的多時間和精力。

最佳話的練習

引用了一些練習題和如何迴避在程式開發中潛在地容易犯的錯誤的方法,是開發更加順利。

為那些人編寫的

如果你從來沒有開發過網站程式,那麼這不適合你,你應該至少掌握一些HTML語言和簡單的Web開發術語。你不需要先前的ASP開發經驗(當然有經驗更好),但是你必須瞭解互動式Web程式開發的概念,包含窗體,指令碼,和資料介面的概念。

2 ASP.NET控制元件

2.1 ASP.net 入門

通常談一個學科,我們老是說,它入門很簡單的嘛,ASP.net也是。ASP.net提出一個概念,就是認為WEB頁面,也是一個窗體,所以,學習過面向物件程式設計的VB VC BC Dephi的朋友,學起來就簡單多了。

一個ASP.net頁面的字尾名是".aspx",所以,IIS在你安裝完ASP.net時,也會把Default.aspx作為你的預設首頁,網管朋友一定要注意了。

ASP.net 是後天編譯執行的,只是在第一次執行時編譯,所以,以後的執行速度比ASP執行快。

2.2 寫自己第一個ASP.net的程式

激動嗎?很快就開始寫第一個程式了,一般學任何語言都要Hello World!一下吧,那我們也來。
在這之前寫要說一下,ASP.net的程式可以用任何東西寫,甚至是Windows的記事本。

3 輸入驗證控制元件

3.1 ASP.net解決了ASP的難題:驗證表單填寫的正確性

如今的商業網站,或者個人網站,多少都有客戶調查啊,使用者註冊之類的東西,必然會用到表單,這些表單的填寫正確與否,明顯是由手寫程式碼的方式來控制的。我承認編寫程式碼,是一項有趣的工作,不過每次驗證表單都來手寫程式碼,我們希望提高我們的工作效率,並不是把我們很有限的時間花在表單的驗證工作上。
基於另外的一些原因,Web應用程式很不好驗證使用者的輸入,HTML 3.2 規範可以讓你控制使用者的反饋,但惡意的或者技術高超的使用者可以繞過,因此即使有了瀏覽器端的手寫程式碼,伺服器端同樣也需要驗證,才能保證安全。

下面是微軟的工作人員,給出的商業網站用手寫程式碼控制表單驗證的弊病。

1. 儘管錯誤資訊或圖示經常與輸入元素相鄰,但是它們幾乎總是位於表的不同單元格中。
2. 頁面中經常會有一個區域來彙總所有錯誤。
3. 許多站點包含客戶端指令碼,以便提供更快捷的反饋,同時防止白白地在與伺服器之間往返。
4. 許多包含客戶端指令碼的站點在出現錯誤時會顯示資訊框。
5. 不僅會驗證文字輸入,還會驗證下拉列表和單選按鈕。
6. 如果某個欄位為空,站點通常會顯示與該條目無效時不同的資訊或圖示。
7. 許多有效性檢查可以很好地代替常用的表示式。
8. 驗證通常是基於兩個輸入之間的比較結果。
9. 以上的驗證任務是一些常見的操作,例如檢查姓名或郵政編碼。大多數站點似乎仍在重複進行這些工作。
10. 因為站點之間的差別通常太大,無法獲得一種完美的解決方案來處理每個站點的所有驗證任務。

如果你想向你的同事證實你有一種很"酷"的方法,可以禁止在姓名欄位裡面輸入空值,記得選擇ASP.net,並且看下面的教程。

3.2 ASP.net進行表單驗證的過程

1. aspx檔案被編譯,執行
2. 使用者輸入資料
3. 觸發Page_Load事件
4. 更改Web控制元件屬性,提示哪裡沒有輸入
5. 將頁面用Html重新輸出給使用者
6. 再次提醒使用者輸入

3.3 Page_Load 過程

Page 物件包含一些與伺服器端驗證有關的重要屬性和方法。下表列出了Page_Load屬性的所有Collect和methed。 

Page_Load方法名 說明
IsValid (最經常使用) 這是最有用的屬性。該屬性可以檢查整個表單是否有效。通常在更新資料庫之前進行該檢查。只有 Validators 集中的所有物件全部有效,該屬性才為真,並且不將該值存入快取 。
Validators 該頁所有驗證物件的集合。這是實現 IValidator 介面的物件的集合。
Validate 在驗證時呼叫的一種方法。在 Page 物件上預設的執行方式是轉至每個驗證器,並要求各驗證器自行評估。

3.4 用來驗證表單的驗證器(Web控制元件)

驗證控制元件 說明
RequiredFieldValidator 檢查使用者是否輸入或選擇了任何內容
RegularExpressionVali-dator 根據規則表示式檢查使用者輸入。該過程允許進行許多種類的檢查,可以用於郵政編碼和電話號碼等的檢查。
CompareValidator 將輸入控制元件與一個固定值或另一個輸入控制元件進行比較。例如,它可以用在口令驗證欄位中。也可以用來比較輸入的日期和數字。
RangeValidator 與 CompareValidator 非常相似, 只是它用來檢查輸入是否在兩個值或其它輸入控制元件的值之間。
CustomValidator 允許使用者編寫自己的程式碼以加入到驗證框架中。

4 資料繫結 DataBind

這一講是ASP.net系列講座中最重要的一講,包括伺服器控制元件,資料庫操作等所有涉及操作資料的控制元件都會用到 DataBind,也就是說DataBind這一講,已經開始講ASP.net核心的問題了。其實DataBind的概念已經提出很長時間了,在ASP中也有應用,只是大家不是很注意而已。 但在ASP.net中,已經把它提升到了一個核心的高度。

4.1 簡單介紹 DataBind

DataBind包括三大方法,Repeater,DataList和DataGrid,這些控制元件都位於 System.Web.UI.WebControls 名稱空間中,從 WebControl 基類中直接或間接派生出來的。這些方法都是通過HTML來顯示資料的內容。

4.2 建立DataBind

所有的DataBind都應該用DataBind() 函式來建立(注意如果你用的是C#,請注意大小寫)資料繫結,是整個頁面PAGE和所有控制元件的一個方法,也就是說,他可以被所有的控制元件使用,你建立資料繫結的時候,DataBind可以作為控制元件的一個子項,比如DataList1.DataBind(),再比如 Page.DataBind(),會繫結整個頁面。DataBind 常在頁面載入時就被繫結。下面這個例子就是這個情況。

VB

ProtectedSub Page_Load(Src AsObject, E As EventArgs)
DataBind()
End Sub

C#

protectedvoid Page_Load(object sender, EventArgs e)
{
DataBind();
}

4.3 開始使用簡單的資料繫結

看這個例子:

VB

Sub SubmitBtn_Click(sender AsObject, e As EventArgs)
Page.DataBind
End Sub

C#

protectedvoid Button1_Click(object sender, EventArgs e)
{
Page.DataBind();
}

.ASPX檔案內容:

<B>幫韋小寶選擇一個老婆</B><form runat=server><asp:DropDownList id="StateList" runat="server"><asp:ListItem>阿珂</asp:ListItem><asp:ListItem>曾柔</asp:ListItem><asp:ListItem>建寧</asp:ListItem><asp:ListItem>沐公主</asp:ListItem><asp:ListItem>雙兒</asp:ListItem><asp:ListItem>教主夫人</asp:ListItem></asp:DropDownList><asp:button Text="Submit" OnClick="SubmitBtn_Click" runat=server/><p>
 您幫韋小寶選擇的老婆是 :
<asp:label text='<%# StateList.SelectedItem.Text %>' runat=server/>
</form>
我們看到,那個選擇老婆的地方沒有使用什麼控制元件,但是他卻能正確的顯示我們的選擇結果,這個是就捆綁的結果,注意
<%# StateList.SelectedItem.Text %>這句話,正是它讓我們取得了捆綁的資料。更多的地方,我們會經常看到這樣的例子,好像程式裡面什麼都沒有,但資料已經繫結在上面了。

5 資料庫的操作

自若干年前推出開放式資料庫連線 (ODBC) 應用程式程式設計介面 (API) 以來,出現了各種各樣的資料庫訪問技術,而 ADO.NET 是其中最新的一種。在這過程中,發生了許多有趣的事。例如,COM 闖入資料庫領域,開始培植 OLE DB 的殖民程序。 然後,大致相當於 OLE DB 自動化版本的 ActiveX? Data Objects (ADO) 被選來統治 Windows? 資料庫開發者的 Visual Basic? 和 ASP 社群。

通過 .NET,Microsoft 正在提供通用框架(即 Framework Class Library),其中將包括所有現有的 Windows API 甚至更多的內容。特別值得一提的是,它包括大量常用的庫,而這些庫現在需要通過各個 COM 物件分別獲得。在這些庫中,您會發現 XML 和 ADO 物件模型,它們被整合到了叫做 ADO.NET 的類子樹中。
ADO.NET 事實上成為構建資料感知 .NET 應用程式的基礎。和 ADO 不同的是,ADO.NET 遵循更通用的原則,不那麼專門面向資料庫。ADO.NET 集合了所有允許資料處理的類。這些類表示具有典型資料庫功能(如索引、排序和檢視)的資料容器物件。儘管 ADO.NET 是 .NET 資料庫應用程式的權威解決方案,但從總體設計上來看,它不象 ADO 模型那樣以資料庫為中心,這是 ADO.NET 的一大特點。

ADO.NET 與 ADO 有很大差異。ADO.NET 是新的資料訪問程式設計模型,需要開發人員的全面理解、投入和新思維。然而,一旦開始掌握 ADO.NET,您將意識到:原有的 ADO 技巧非常有助於您以不同、卻更巧妙和可靠的方式來建立有效的應用程式和解決各種老問題。
(以上譯自 Microsoft .NET部一位官員的講話)

5.1 目前的ADO.net

目前 ADO.NET 提供了兩種託管提供程式:一種用於 SQL Server 7.0 或更高版本,另一種用於其他所有您可能已經安裝的 OLE DB 提供程式。在這兩種情況下您分別使用不同的類,但遵循相似的命名規則。除字首外,名稱都是相同的。前一種情況字首為 SQL,後一種情況則是 ADO。

VB

Imports System.Data.DAO
Imports System.Data.Sql

C#

using System.Data.DAO;
using System.Data.Sql; 

您應該使用 SQL 類訪問 SQL Server 表,因為它們直接進入資料庫伺服器的內部 API,跳過了由 OLE DB 提供程式表示的中間層。ADO 類是 OLE DB 提供程式上的 .NET 介面,它們使用 COM Interop 橋進行工作。

5.2 連線一個數據庫

VB

Dim myConnection AsNew SQLConnection("server=localhost;uid=sa;pwd=;database=pubs")
Dim myCommand AsNew SQLDataSetCommand("select * from Authors", myConnection)

C#

SqlConnection myConnection =new SqlConnection ("server=localhost;uid=sa;pwd=;database=pubs");
SqlCommand myCommand 
=new SqlCommand ("select * from Authors", myConnection);

這裡我們需要講述一下Connection的方法和屬性了。

ConnectionTimeout 超時
DataBase 預設資料庫
DataSource DNS
UserID 使用者名稱,原來叫UID
Password 密碼
State 取得目前連線的狀態
Open() 開啟
Close() 關閉

6 幾個重要檔案

使用ASP的同仁們一定經常使用這些東西,因為不管什麼產品的開發都離不開與使用者的互動,而在ASP中,他們三個,正是互動的橋樑。
ASP.net中,他們也受到了足夠的重視,但改變不是很大。

6.1 Application

Application的生命週期

Application的生命週期,並不是是從IIS5開始啟動的那一刻開始,而是從客戶對伺服器發出第一個Request的那個時候開始的。從那時開始一個名叫HTTPApplication的Pool開始建立,這也是Application生命週期(lifetime)的開始。此時Application_OnStart的事件也發生了。直到Application_OnEnd的事件發生,才是Application生命週期的結束。

Application寫的網站計數器

VB

Application.Lock()
Application(
"counter"=CType(Application("counter"+1, Int32)
Application.UnLock() 

C#

Application.Lock();
Application(
"counter"= Convert.ToInt32(Application("counter")) +1;
Application.UnLock();

與ASP中還是一樣的。

Application與ASP中的不同的地方

Application與ASP不同的地方在於新多了兩個事件Application_OnRequest Start()和Application_OnRequestEnd() 這兩個事件,在使用者開始瀏覽一個aspx檔案,和aspx檔案執行結束時觸發,也就是說,這兩個事件,不是針對整個伺服器來說的,而是對於單個程式來說。

6.2 Session

在ASP中,我們都知道,如果使用者把瀏覽器上面的Cookies關掉,那麼Session就不可能被傳遞了,ASP.net針對這個問題,提出Session的傳遞應該脫離Cookies。我們修改一下config.web,還記得這個檔案嗎?ASP.net的無安裝化程式移植的精髓,都在這樣的一個檔案中。

修改如下地方:
<sessionstate cookieless="false" />

改為True就可以了

其他地方 Session和ASP沒有什麼區別。

7 如何存取SQL Server資料庫圖片

SQL Server提供了一個特別的資料型別:image,它是一個包含binary資料的型別。下邊這個例子就向你展示瞭如何將文字或照片放入到資料庫中的辦法。在這篇文章中我們要看到如何在SQL Server中儲存和讀取圖片。

1、建立一個表:

在SQL SERVER中建立這樣結構的一個表:

列名 型別 目的
ID Integer 主鍵ID
IMGTITLE Varchar(50) 圖片的標題
IMGTYPE Varchar(50) 圖片型別. ASP.net要以辨認的型別
IMGDATA Image 用於儲存二進位制資料

2、儲存圖片到SQL SERVER資料庫中

為了能儲存到表中,你首先要上傳它們到你的Web 伺服器上,你可以開發一個web form,它用來將客戶端中TextBox web control中的圖片入到你的WEB伺服器上來。將你的 encType 屬性設定為:myltipart/formdata.

Stream imgdatastream = File1.PostedFile.InputStream;
int imgdatalen = File1.PostedFile.ContentLength;
string imgtype = File1.PostedFile.ContentType;
string imgtitle = TextBox1.Text;
byte[] imgdata =newbyte[imgdatalen];
int n = imgdatastream.Read(imgdata,0,imgdatalen);
string connstr=((NameValueCollection)Context.GetConfig("appSettings"))["connstr"];
SqlConnection connection 
=new SqlConnection(connstr);
SqlCommand command 
=new SqlCommand
 (
"INSERT INTO ImageStore(imgtitle,imgtype,imgdata) VALUES ( @imgtitle, @imgtype,@imgdata )", connection );SqlParameter paramTitle =new SqlParameter
 (
"@imgtitle", SqlDbType.VarChar,50 );
paramTitle.Value 
= imgtitle;
command.Parameters.Add( paramTitle);
SqlParameter paramData 
=new SqlParameter( "@imgdata", SqlDbType.Image );
paramData.Value 
= imgdata;
command.Parameters.Add( paramData );
SqlParameter paramType 
=new SqlParameter( "@imgtype", SqlDbType.VarChar,50 );
paramType.Value 
= imgtype;
command.Parameters.Add( paramType );
 
connection.Open();
int numRowsAffected = command.ExecuteNonQuery();
connection.Close();

3、從資料庫中恢復讀取

現在讓我們來從SQL Server中讀取我們放入的資料吧!我們將要輸出圖片到你的瀏覽器上,你也可以將它存放到你要的位置。

privatevoid Page_Load(object sender, System.EventArgs e)
{
 
string imgid =Request.QueryString["imgid"];
 
string connstr=((NameValueCollection)
 Context.GetConfig(
"appSettings"))["connstr"];
 
string sql="SELECT imgdata, imgtype FROM ImageStore WHERE id = "+ imgid;
 SqlConnection connection 
=new SqlConnection(connstr);
 SqlCommand command 
=new SqlCommand(sql, connection);
 connection.Open();
 SqlDataReader dr 
= command.ExecuteReader();
 
if(dr.Read())
 {
  Response.ContentType 
= dr["imgtype"].ToString();
  Response.BinaryWrite( (
byte[]) dr["imgdata"] );
 }
 connection.Close();
}