asp.net初學習實現簡單的增刪改查功能
在學習中發現網頁模板可以大大節約重複的頁面程式碼,同時對於WebSite開發的程式在不同的頁面直接呼叫已寫好的程式碼既不方面,只是作為程式碼量不大的程式進行開發還是比較方便。
get和post的區別get是通過url傳遞表單值,post通過url看不到表單域的值;get傳遞的資料量是有限的,如果要傳遞大資料量不能用get,比如上傳文章、傳遞密碼或者<textarea>發表大段文章,post則沒有這個限制;post會有瀏覽器提示重新提交表單的問題。也就是說get和post都是以不同的方式提交表單的資訊,只是方式不一樣,post是以頭報文的形式傳遞,我們可以使用火狐的免費外掛firebug或者免費的httpwatch(破解版的當然免費),看到這些。
簡單的說瀏覽器和伺服器直接就是請求和迴應,內部的具體細節可以看看部落格園中的很多示例圖,當然我們可以分析一下,就是瀏覽器通過DNS解析後向伺服器傳送請求,服務端偵聽到客戶端(瀏覽器)請求,開始分配相應套接字並建立連線,之後就是一方傳送一方接收回應的過程,這裡面存在一個長連線短連線的概念,具體還是查資料,這裡就不多說了。
現在我們先來分析一下已經生成好的web程式,我們來反編譯看下具體的執行過程。
我們只看其中關鍵的部分,也是我們一般程式中的主體部分,使用reflector
1 [CompilerGlobalScope] 2 public class default_aspx : _Default, IHttpHandler3 { 4 // Fields 5 private static object __fileDependencies; 6 private static bool __initialized; 7 8 // Methods 9 [DebuggerNonUserCode] 10 public default_aspx(); 11 [DebuggerNonUserCode] 12 private HtmlHead __BuildControl__control2(); 13 [DebuggerNonUserCode] 14private HtmlTitle __BuildControl__control3(); 15 [DebuggerNonUserCode] 16 private HtmlForm __BuildControlform1(); 17 [DebuggerNonUserCode] 18 private void __BuildControlTree(default_aspx __ctrl); 19 [DebuggerNonUserCode] 20 protected override void FrameworkInitialize(); 21 [DebuggerNonUserCode] 22 public override int GetTypeHashCode(); 23 [DebuggerNonUserCode] 24 public override void ProcessRequest(HttpContext context); 25 } 26 27 28 Expand Methods 29
它對應的原始碼如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <title>測試</title> 8 </head> 9 <body> 10 <form id="form1" runat="server"> 11 <div> 12 13 </div> 14 </form> 15 </body> 16 </html>
現在我們再來看關鍵的部分:
1 [DebuggerNonUserCode] 2 private void __BuildControlTree(default_aspx __ctrl) 3 { 4 this.InitializeCulture(); 5 IParserAccessor accessor = __ctrl; 6 accessor.AddParsedSubObject(new LiteralControl("\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n")); 7 HtmlHead head = this.__BuildControl__control2(); 8 accessor.AddParsedSubObject(head); 9 accessor.AddParsedSubObject(new LiteralControl("\r\n<body>\r\n ")); 10 HtmlForm form = this.__BuildControlform1(); 11 accessor.AddParsedSubObject(form); 12 accessor.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>\r\n")); 13 }
從上面可以看出,.NET執行時將html建立成一個樹物件,而後已以建立節點物件模型
1 [DebuggerNonUserCode] 2 private HtmlTitle __BuildControl__control3() 3 { 4 HtmlTitle title = new HtmlTitle(); 5 IParserAccessor accessor = title; 6 accessor.AddParsedSubObject(new LiteralControl("測試")); 7 return title; 8 }
這裡我只是讓大家能看到 <title>測試</title>的效果,具體的可以自己看看。
下面就寫個小程式碼試下手感受下asp.net web開發,基本原理都差不多隻是對於剛從Winform轉過來的同學感覺上很繁瑣,節約時間不多說了,直接上程式碼,程式碼簡單就是為了自己熟悉測試的
1 <%@ WebHandler Language="C#" Class="List" %> 2 3 using System; 4 using System.Web; 5 using System.Data; 6 using System.Data.SqlClient; 7 8 public class List : IHttpHandler { 9 10 public void ProcessRequest (HttpContext context) { 11 context.Response.ContentType = "text/html"; 12 DataTable dt = SqlHelper.ExecuteDataTble(); 13 System.Text.StringBuilder sb = new System.Text.StringBuilder(); 14 foreach (DataRow dr in dt.Rows) 15 { 16 sb.AppendLine(" <tr>"); 17 sb.AppendLine("<td>" + dr["s_no"] + "</td>"); 18 sb.AppendLine("<td>" + dr["s_name"] + "</td>"); 19 sb.AppendLine("<td>" + dr["s_sex"] + "</td>"); 20 sb.AppendLine("<td>" + dr["s_birthday"] + "</td>"); 21 sb.AppendLine("<td>" + dr["s_avgrade"] + "</td>"); 22 sb.AppendLine("<td>" + dr["s_dept"] + "</td>"); 23 sb.AppendLine("<td><a href=del.ashx?id="+dr["s_no"]+">刪除</td>"); 24 sb.AppendLine("<td><input type='checkbox' name='ckdel' value= '"+ dr["s_no"]+"'/>選擇</td>"); 25 sb.AppendLine("<td><a href='UpdateRecord.ashx'>修改</td>"); 26 sb.AppendLine("<tr>"); 27 } 28 string content = System.IO.File.ReadAllText(context.Server.MapPath("model.htm")); 29 content = content.Replace("@replace", sb.ToString()).Replace("@title", "學生資訊表"); 30 context.Response.Write(content); 31 } 32 33 public bool IsReusable { 34 get { 35 return false; 36 } 37 } 38 39 } 40 public class SqlHelper 41 { 42 public static System.Data.DataTable ExecuteDataTble() 43 { 44 using (SqlConnection con = new SqlConnection("Data Source=ROHELM-PC;Initial Catalog=T-SQL練手;Integrated Security=True")) 45 { 46 using (SqlCommand cmd = con.CreateCommand()) 47 { 48 cmd.CommandText = "select * from student"; 49 DataTable dt = new DataTable(); 50 SqlDataAdapter da = new SqlDataAdapter(cmd); 51 da.Fill(dt); 52 return dt; 53 } 54 } 55 } 56 }
下面這個其實儲存的形式是什麼無關緊要的,只要是文字形式就行。
model刪除部分
del新增部分
add使用資料庫指令碼:
SQL執行效果:
其他操作顯示區域沒有調整好,且受到上傳圖片的限制未演示。