值得收藏的asp.net基礎學習筆記_實用技巧

來源:互聯網
上載者:User

值得收藏的asp.net基礎學習筆記,分享給大家。

1.概論 瀏覽器-伺服器 B/S 瀏覽的 

瀏覽器和伺服器之間的互動,形成上網B/S模式

對於HTML傳到伺服器  交給伺服器軟體(IIS)  伺服器軟體直接讀取靜態頁面代碼,然後返回瀏覽器

對於ASPX傳達伺服器  交給伺服器軟體(IIS)   IIS發現自己處理不了aspx的檔案,就去映射表根據尾碼名裡找到響應的處理常式(isapi,伺服器擴充程式) 問題:IIS如何調用可擴充程式? 答:可擴充程式首先就是按照IIS提供的借口實現代碼,所以IIS就知道如何調用.


2.什麼是asp.net

!asp.net是一種動態網頁技術,在伺服器端運行.net代碼,動態產生HTML,然後響應個瀏覽器

*注意,主要的操作都是伺服器進行操作,瀏覽器只是傳輸指令 

!可以使用JavaScript, Dom在瀏覽器端完成很多工作,但是有很多工作無法再瀏覽端完成,比如儲存資料,訪問資料庫沒複雜的商務邏輯運算,安全性要求高的邏輯運算等.

!服務端控制項和HTML控制項產生關係: 在aspx頁面中可以使用服務端控制項,簡化開放. 但瀏覽器只認html, 因此在包含服務端控制項的頁面被請求時,頁面中的伺服器端控制項會組裝成對應的HTML控制項代碼字串,比如 TextBox : <input type="text" />

!asp.net:ASHX(一般處理常式) (在伺服器上運行最快的) ,WebForm,WVC3 (Model, View, Controler)

!伺服器控制項不是新的控制項,在瀏覽器端仍然是產生html標籤,服務端控制項雖然好用,但是也有缺點,並不是什麼地方用伺服器端控制項都好,具體後面講. 

3.aspx.net裡的熱門檔案(重點)

第一個小例子: 動態登入程式

  public void ProcessRequest (HttpContext context) {  string modelPath = context.Server.MapPath("LoginModel.htm");  string htmlSendBack = System.IO.File .ReadAllText(modelPath);  context.Response.ContentType = "text/plain";  context.Response.Write(htmlSendBack);  if (!string .IsNullOrEmpty(context.Request.Form[ "txtName"]))  {   if (context.Request.Form["txtName" ] == "zhu" &&    context.Request.Form[ "txtPassword"] == "123" )   {    context.Response.Write( "登入成功!" );   }   else    context.Response.Write( "登入失敗!" );  } }

4.一般處理常式(HttpHandler)

一.一般處理常式(HttpHandler):

是一個實現System.Web.IHttpHandler特殊介面的類.

任何一個實現了IHttpHandler介面的類都能作為一個外部請求的目標程式: (凡是沒有實現此介面的類,都不會被瀏覽器請求)

二.它由支援asp.net的伺服器調用和啟動運行.一個HttpHandler程式負責處理它對應的一個或一組URL地址的訪問請求,並接受用戶端發出的訪問資訊和產生相應內容.

三.咱可以通過建立一個我們自己的HttpHandler程式來產生瀏覽器代碼返回用戶端瀏覽器

四.HttpHandler程式可以完成普通類程式能完成的大多數任務:

1.湖區用戶端通過HTML的Form表單提交的資料和URL參數

2.建立對用戶端的響應資訊內容

3.訪問服務端的檔案系統

4.串連資料庫並開發基於資料庫的應用

5.調用其他類 

5.請求相應的過程 

1.使用者在瀏覽器地址欄輸入:http://localhost:80777/FirstShower.ashx
2.伺服器接收到使用者的請求,發現是請求.ashx檔案,便將請求交給framework執行,fw找到對應的檔案first.ashx,執行後將產生的字串(通常是html+css+javascript格式)返回瀏覽器
3.瀏覽器接收到伺服器返回的資料,並按照http文法解釋執行,以介面的方式展示給使用者看到.(此時如果html等代碼中包含外部檔案,則再次發送單獨請求伺服器相應檔案資料) 

 6.HTTP請求詳解圖 

7.ashx? -HttpHandler(一般處理常式)

 IHttpHandler  hander = new 頁面類();
 hander.ProcessRequest(); //調用的頁面類中的方法,這是介面的優點

ContentType  標記放回對象在網頁中的解釋語言   

text/html使用html語言翻譯

就是設定伺服器發出的響應報文的ContentType屬性,瀏覽器根據此屬性內容,使用不同的方法處理[響應報文]

8.編譯過程 

1.每一個請求都會要建立 一個HttpWorkerRequest和HttpApplication
2.HttpWorkerRequest 裡面 放的是 每一個請求報文裡的資料
3.HttpApplication對象裡面放的是  每一個請求要執行的代碼
4.為每個請求建立單獨的HttpApplication對象, 那麼針對此次請求的所有運行過程都在此對象中完成

Factory的理解:: HttpApplication池,每次HttpApplicationFectory都會在這個池裡找有沒有閒置HttpApplication對象,如果有,就直接拿出來用,沒有就建立新的使用.

伺服器做的事情:  接受瀏覽器請求, 建立頁面類的對象, 實現介面, 調用裡面的方法, 返回相應的東東

HttpRuntime裡面,由此類,處理所有的請求,它的工作 

1.分析請求報文,並將報文資料封裝入一個叫做HttpWorkerRequest類對象
2.建立HttpContext對象, 次對象是當前請求的上下文環境,裡麵包含處理請求的所有參數資料,其中最重要的就是HttpRequest和HttpResponse兩個類(方便取值)
3.HttpRequest主要包含了所有的請求資訊,這些資訊來源於HttpWorkRequest對象,對象包含屬性:Form(客戶串連資料)QueryString(用戶端url參數)
4.HttpResponse主要包含了一個FileStream對象, 用來儲存頁面類執行過程中要輸出給瀏覽器的資料
5.通過調用HttpApplicationFectory的類的一個靜態方法來建立HttpApplication類對象中對應屬性
6.因為在HttpApplication裡要運行被請求的頁面類對象裡的ProcessRequest方法,所以,需要將HttpContext對象傳入到HttpApplication中來   ( IHttpHandler hander = 通過反射方式建立被請求的頁面類對象    )?

執行HttpApplication的ProcessRequest方法 ( 可以將此方法的執行過程看成一個管道 ) 此方法中, 要先後按照順序執行19個委託事件 

•在其中第8個事件時,建立 被請求的頁面類的對象
•在11個和12個中間,執行了 被建立的頁面類的ProcessRequest方法 

9.伺服器怎麼接受和發送資料?

HTTP Request Response

9.1 Request(HttpRequest) & Response(HttpResponse)

一, 瀏覽器提交資料方式
1 表單 (資料藏在請求報文體中, 格式txtname=jamws&txtpwd=123)

<form action="login.ashx" method="post">    <input type="text" name="txtname"/>     <input type="password" name="txtpwd"/> </form>

 2地址欄URL參數(和表單的Get方式一樣):索引值對 瀏覽器請求屬性 http://127.0.0.1/login.ashx?txtname 1=jordan&txtpwd 1=123

二,伺服器如何擷取瀏覽器提交的資料?
1擷取表單資料 context.Request.Form["txtname"] 
2擷取URL參數: context.Request.QueryString["txtname1"]

三,伺服器如何向瀏覽器輸出參數

context.Response.Write("我是從伺服器輸出到瀏覽器的資料!"); 

當使用者在瀏覽器點擊提交按鈕時,瀏覽器自動幫我們將表單中帶name的控制項的值以賦值對字串的方式,作為[http請求報文體]提交到伺服器.

Request本身也可以看做一個用戶端提交過來的所有參數 
Request.Form 包含的只有用戶端通過post方式提交過來的資料
Reuqest.QueryString 包含的只有用戶端通過get方式提交過來的資料

get : 獲得,拿去--當瀏覽器發送請求報文是為了從伺服器獲得資料的時候,就用get
post : 傳遞,有地,發送過去. --當瀏覽器發送請求報文傳遞參數過去,就用post 


public void ProcessRequest (HttpContext context) {  context.Response.ContentType = "text/html";  System.Text. StringBuilder sbHTML = new System.Text.StringBuilder();  sbHTML.Append( "<html><head><title>登入頁面</title></head><body><form action='03Login.ashx' method='post'>");  sbHTML.Append( "使用者名稱:<input type='text' name='txtname' /> <br />" );  sbHTML.Append( "密碼:<input type='password' name='txtpwd' /> <br/>" );  sbHTML.Append( "<input type='submit' value='登入'/><a href='04Reg.ashx?a=222'>註冊</a> <br/>");  sbHTML.Append( "</form></body></html>" );  context.Response.Write(sbHTML.ToString());  //獲得瀏覽器表單post方式傳遞來的值  string strUserName = context.Request.Form["txtname"];  if (!string .IsNullOrEmpty(strUserName))  {   context.Response.Write( "Form中的值:" + strUserName);  }  //獲得瀏覽器表單get方式傳遞來的值  string strUserNameGet = context.Request.QueryString["txtname"];  if (!string .IsNullOrEmpty(strUserNameGet))  {   context.Response.Write( "Url中得到的值:" + strUserNameGet);  } }

9.2 Request(HttpRequest) 重要成員

重新導向原理圖如下: 

------------------類比wubForm的使用者控制項資料保持------------------

  public void ProcessRequest (HttpContext context) {  context.Response.ContentType = "text/html";  string strNum1 = context.Request.Form["txtNum1" ];  string strNum2 = context.Request.Form["txtNum2" ];  //判斷是否格式正確  string result = "0" ;  int num1 = 0, num2 = 0;  if (!string .IsNullOrEmpty(strNum1) && ! string.IsNullOrEmpty(strNum2))  {      if (int .TryParse(strNum1, out num1) && int.TryParse(strNum2, out num2))   {    result = (num1+num2).ToString();   }   else   {    result = "輸入格式錯誤" ;   }  }  System.Text. StringBuilder sbHTML = new System.Text.StringBuilder();  sbHTML.Append( "<!DOCTYPE><html><head><title>計算機</title></head><body><form action='06Calculate.ashx' method='post'>");  sbHTML.Append( "<input type='text' name='txtNum1' value='" +   num1.ToString() + "' /> + <input type='text'name='txtNum2' value='" +   num2.ToString() + "'/> = <input type='text' readonly='readonly' value='" +   result.ToString() + "' <br/>");  sbHTML.Append( "<input type='submit' value='計算'/><br />" );  sbHTML.Append( "</form></body></html>" );    context.Response.Write(sbHTML.ToString()); }

------------------類比WebForm回傳檢查機制------------------ 

  public void ProcessRequest (HttpContext context) {  context.Response.ContentType = "text/html";  string strNum1 = context.Request.Form["txtNum1" ];  string strNum2 = context.Request.Form["txtNum2" ];  //判斷是否格式正確  string result = "0" ;  int num1 = 0, num2 = 0;  //如果包含隱藏欄位的話, 才執行相加操作  if (!string .IsNullOrEmpty(context.Request.Form[ "hidIsPostBack"]))  {   if (!string .IsNullOrEmpty(strNum1) && ! string.IsNullOrEmpty(strNum2))   {    if (int .TryParse(strNum1, out num1) && int.TryParse(strNum2, out num2))    {     result = (num1 + num2).ToString();    }    else    {     result = "輸入格式錯誤" ;    }   }  }  System.Text. StringBuilder sbHTML = new System.Text.StringBuilder();  sbHTML.Append( "<!DOCTYPE><html><head><title>計算機</title></head><body><form action='06Calculate.ashx' method='post'>");  sbHTML.Append( "<input type='text' name='txtNum1' value='" +   num1.ToString() + "' /> + <input type='text'name='txtNum2' value='" +   num2.ToString() + "'/> = <input type='text' readonly='readonly' value='" +   result.ToString() + "' <br/>");  sbHTML.Append( "<input type='submit' value='計算'/><br />" );  sbHTML.Append( "<input type='hidden' name='hidIsPostBack' value='1' /></form></body></html>" );    context.Response.Write(sbHTML.ToString()); }

----------------------------基於物件導向的計算機----------------------------

 //---------------------------------類定義--------------------------------------------/// <summary>///一個計算機類/// </summary>public class Class1{ //第一個運算元 public int num1 { get; set; } //第二個運算元 public int num2 { get; set; } //操作符 public string calculateChar{ get; set; } //結果 public string result { get; set; } public Class1() { } /// <summary> /// 計算結果 /// </summary> /// <param name="a"> 第一個運算元 </param> /// <param name="b"> 第二個運算元 </param> /// <param name="oper"> 操作符</param>     public void GetResult(int a, int b, string oper)    {  this.num1 = a;  this.num2 = b;  this.calculateChar = oper;  switch (this .calculateChar)  {   case "+" :    result = (num1 + num2).ToString();    break;   case "-" :    result = (num1 - num2).ToString();    break;   case "*" :    result = (num1 * num2).ToString();    break;   case "/" :    result = (num1 / num2).ToString();    break;  }    }} //------------------------------------------------------頁面類----------------------------------------------------------public class _07CalculateFour : IHttpHandler {  public void ProcessRequest (HttpContext context) {  context.Response.ContentType = "text/html";  //執行個體化一個計算機對象  Class1 calcu = new Class1();  string strNum1 = context.Request.Form["txtNum1" ];  string strNum2 = context.Request.Form["txtNum2" ];  string strOper = context.Request.Form["optionOper" ];  int num1 = 0;  int num2 = 0;  if (!string .IsNullOrEmpty(context.Request.Form[ "hidIsPostBack"]))  { //類比回訪   if (!string .IsNullOrEmpty(strNum1) && ! string.IsNullOrEmpty(strNum2))   { //判斷為空白    if (int .TryParse(strNum1, out num1) && int.TryParse(strNum2, out num2))    { //判斷格式     calcu.GetResult(num1, num2, strOper);    }    else    {     calcu.result = "參數格式不正確" ;    }   }  }  System.Text. StringBuilder sbHTML = new System.Text.StringBuilder();  sbHTML.Append( "<!DOCTYPE ><html><head></head><body><form action='07CalculateFour.ashx' method='post'>");  sbHTML.Append( "<input type='text' name='txtNum1' value='" +calcu.num1.ToString()+"'/>");  sbHTML.Append( "<select name='optionOper'><option value='"+calcu.calculateChar+ "'>"+calcu.calculateChar+"</option><option value='+'>+</option><option value='-'>-</option><option value='*'>*</option><option value='/'>/</option></select>" );  sbHTML.Append( "<input type='text' name='txtNum2' value='" +calcu.num2.ToString()+"'/> = ");  sbHTML.Append( "<input type='text' readonly='readonly' name='txtResult' value='" +calcu.result+"'/>");  sbHTML.Append( "<input type='submit' value='計算'/>" );  sbHTML.Append( "<input type='hidden' name='hidIsPostBack' value='1'/></form></body></html>" );  context.Response.Write(sbHTML.ToString()); }

 10.注意,關於提交表單的內容 

•只能為input, textarea, select三種類型的標籤, 只有input(文字框/CheckBox等)使用者才可以填寫值,<label>,<p>,<font>等標籤僅提供顯示用,沒有提交到伺服器的必要.
•只有value屬性的值才會提交給伺服器, 以input標籤為例, input標籤有title,type,disabled等屬性,但這些屬性都是供顯示用的,使用者不能修改,只有value屬性才是使用者輸入的屬性,因此只有value屬性的值才會被提交到伺服器
•標籤必須設定name屬性. 學習Dom的時候我們知道,如果通過Javascript操作標籤,必須為標籤設定id屬性. 如果要將標籤的value屬性提交到伺服器,則必須為標籤設定name屬性,提交到伺服器會以"name=value"的索引值對方式提交給伺服器,用&隔開,除了選項按鈕等少數標籤,那麼可以重複,其他name都不能重複. name是給伺服器用的,id是給dom用的,對於RadioButton,同name的為一組,選中的radiobutton的value被提交到伺服器.
•如果設定了控制項的disabled屬性的話,瀏覽器不會把資料交給伺服器
•放到form標籤內,只有放到form標籤才可能會被提交到伺服器,form之外的input等標籤被忽略. 

11.使用模版來清晰代碼,利用虛擬模版網頁 

•使用隱藏欄位, 類比IsPostBack, <input type="hidden" name="hidIsPostBack" value="true" />
•在模版網頁中,涉及到修改值得時候, 可以使用預留位置, 之後, 直接替換就可以了, 使用{name}的形式即可 

public class _08Cal : IHttpHandler {  public void ProcessRequest (HttpContext context) {  context.Response.ContentType = "text/html";  //--------------------讀取html內容模版----------------------  //根據虛擬路徑獲得實體路徑  string path = context.Server.MapPath("CalculateModel.htm"); //這裡仔細記住  string strHTML = System.IO.File.ReadAllText(path); //這裡也要好好記住  //------------------獲得瀏覽器提交的內容---------------------------  string strNum1 = context.Request.Form["txtNum1"];  string strNum2 = context.Request.Form["txtNum2"];  int num1 = 0;  int num2 = 0;  string result = "";  if (!string.IsNullOrEmpty(context.Request.Form["hidIsPostBack"]))  {   if (!string.IsNullOrEmpty(strNum1) && !string.IsNullOrEmpty(strNum2))   {    if (int.TryParse(strNum1, out num1) && int.TryParse(strNum2, out num2))    {     result = (num1 + num2).ToString();    }    else    {     result = "輸入格式錯誤";    }   }  }  //-------------------------輸出html到瀏覽器------------------------  //字串替換,進行賦值  strHTML = strHTML.Replace("{num1}", num1.ToString()).Replace("{num2}", num2.ToString()).Replace("{result}", result.ToString());  context.Response.Write(strHTML); }  public bool IsReusable {  get {   return false;  } }}
//---------------------------------模版網頁顯示---------------------------------------<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">< html>< head> < title> 計算機 </title ></ head>< body> < form action ='06Calculate.ashx' method ='post'> < input type ='text' name ='txtNum1' value ='{num1}' /> +  < input type ='text' name ='txtNum2' value ='{num2}' /> = < input type ='text' readonly ='readonly' value ='{result}' />< br /> < input type ='submit' value ='計算' /> < input type ='hidden' name ='hidIsPostBack' value ='1' /> </ form></ body></ html>

12.表單的提交方式Get與Post 

     get傳遞的資料量是有限的, post發送的資料量沒有限制  
     post會產生重新整理重新提交表單的問題, get就沒有這樣的問題,  可以通過地址欄重敲解決該問題 
     Get方式URL資料格式,  ? 後面  & 分割,  URL中有漢字會進行URL編碼 

     表單域只有設定了name的才會傳參, get看得清楚, submit如果有value, 也會傳遞

13.資料自增 

•http是無狀態的, 瀏覽器每次請求伺服器的頁面類時,伺服器都會建立一個該類的對象,並調用裡面的方法執行,最後返回輸出結果給瀏覽器,然後對象銷毀中斷連線
•瀏覽器和伺服器都是不認識對方的 

Connection: Keep-Alive  告訴伺服器瀏覽器希望使用的長串連   短串連是相當於一次性串連 

短串連的缺點: 儘管客戶只想訪問一個頁面,html但依然向瀏覽器發送了多次新的串連請求,建立了多次新的串連,消耗了雙方的時間的資源 

http短串連: 伺服器在每次響應完瀏覽器的一個請求後立馬關閉當前串連(socket). 

長串連:  伺服器不會立刻在發送完資料後關閉串連通道(通訊端),而是會等一段時間(2秒),兩秒之內,如果相同瀏                             覽器再次發送請求過來,那麼繼續使用此串連通道向瀏覽器輸出資料,然後再登一段時間,直到2秒後,沒有新的請求過來,那麼伺服器關閉串連通道 

反編譯工具不停去找,去理解原理,運行機制  ---  牛人 

一般處理常式_簡單請求, 關於ContentType, 獲得url參數(http參數get/post傳遞本質). (請求過程原理; 總體請求過程原理,頁面編譯過程), 請求資料和接受資料以及定向原理, 類比WebForm回傳檢查機制, 類比wubForm的使用者控制項資料保持, 自增(解決http的無狀態), 登入過程 

接下去的學習: 

加法計算機, 增刪查改, 搭建三層構架, 列表和刪除, 刪除資訊功能, 新增 

上傳單個檔案, 產生縮圖, 一般處理常式輸出圖片(簡單驗證碼圖片), 輸出浮水印圖片, 附近下載, 複習總結。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.