ASP.NET 4 学习笔录
基础知识
1. Web应用程序基础
1.1 HTTP 请求
1.1.1 从浏览器发出的HTTP请求
1.1.2 在不使用浏览器的情况下生成请求
构建一个简单的HTTP请求程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; namespace WebRequestorApp { class Program { static void Main(string[] args) { WebRequest req = WebRequest.Create("http://www.microsoft.com"); WebResponse resp = req.GetResponse(); StreamReader reader = new StreamReader(resp.GetResponseStream()); Console.WriteLine(reader.ReadToEnd()); Console.ReadLine(); } } }
1.2 超文本标记语言
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <h2>Hello there. Whate's your favorite .NET feature?</h2> <select name="Feature"> <option>Type-Satety</option> <option>Garbage collection</option> <option>Multiple syntaxes</option> <option>Simpler threading</option> <option>Versioning purgatory</option> </select> <br /> <input type="submit" name="Lookup" value="Lookup" /> <br /> </body> </html>
1.3 动态内容
1.3.1 HTMl表单
1.3.4 Internet信息服务
1.4 传统的ASP:ASP.NET前身
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <form> <h3>Hello world!!! This is an ASP page.</h3> <%Response.Write("This content was generated ");%> <%Response.Write("as part of an execution block");%> </form> </body> </html>
1.5 Web开发思想
处理两大问题:
n 在无线连接型协议上通过HTML来管理用户界面(UI);
n 管理应用程序状态。
1.6 ASP.NET
ASP.NET1.0 引入一条明确管线、高效、扩展、服务器控件、简化模型
ASP.NET2.0 极大改进身份验证与授权服务方面
ASP.NET3.5 支持异步Java和XML风格编程
1.7 IIS快速参考
打开“Internet 信息服务(IIS)管理器” |
打开“控制面板”,找到“管理工具”,选择“Internet信息服务管理器” |
新建虚拟目录 |
打开“Internet 信息服务(IIS)管理器”,依次展开“网站”|Default Web Site。在Default Web Site。在Default Web Site 节点上右击,选择“添加虚拟目录”。然后根据向导的提示进行操作 |
在IIS中浏览某个资源 |
在所有要浏览的资源上右击,然后选择“浏览”图标按钮 |
查看特定IIS虚拟目录中支持的文件类型 |
选择该虚拟目录,在“过年视图”中浏览“处理程序映射”和“模块”页面 |
2. ASP.NET 应用程序基础
2.1 经典的Hello World程序
构建Hello World Web应用程序
1. 创建将要包含Web应用程序文件的目录。
2. 创建一个放置文件的应用程序/虚拟目录。
3. 制作一个简单的HTML页面。
4. 浏览这个页面。
5. 将这个HTML文件转换为ASP.NET应用程序。
6. 查看浏览器所解析的HTML源代码。
2.1.1 可执行代码与HTML的混合
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <% Response.Write("Check out the family tree: <br> <br>"); Response.Write(this.GetType().ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.BaseType.BaseType.ToString()); %> </body> </html>
2.1.2 服务器端的可执行块
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> void ShowLineage() { Response.Write("Check out the family tree: <br> <br>"); Response.Write(this.GetType().ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.BaseType.BaseType.ToString()); } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> </head> <body> <h1>Hello World!!!</h1> <% // This block will execute in the Render_Control method ShowLineage(); %> </body> </html>
2.2 ASP.NET编译模型
查看ASP.NET程序集
n 为运行ILDASM,请打开“Visual Studio 命令提示(2010)”,然后输入ILDASM。
n 选择“文件”|“打开”命令。
n 查找 ASP.NET 运行库编译的程序集。进入 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\aspnetstepbystep4\......
2.3 编码风格
2.3.1 ASP.NET 1.x风格
2.3.2 现代ASP.NET 风格
2.4 ASP.NET HTTP管线
2.4.1 IIS 5.x和IIS 6.x 的管线
2.4.2 IIS 7.x集成的管线
2.4.3 管线内部的组件
2.4.3.1 HttpApplication
2.4.3.2 HttpContext
-- Response 对象的引用(可用于向客户端发送输出)
-- Request 对象的引用(可用于获取有关请求变身的信息)
-- 中心应用程序本身的应用(可用于获取应用程序的状态)
-- 针对每个请求的字典的引用(可用于在请求的生命周期中存储数据)
-- 应用程序范围缓存的引用(可用于存储数据,从而避免与数据库的频繁交互)
2.4.3.3 HttpModule
2.4.3.4 HttpHandler
2.5 Visual Studio与ASP.NET
2.5.1 本地IIS网站
2.5.2 基于文件系统的网站
2.5.3 FTP网站
2.5.4 远程网站
2.5.5 Hello World 与 Visual Studio
创建HelloWorld Web应用程序
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="HelloWorld.aspx.cs" Inherits="HelloWorld" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <h2>Hello World!</h2> <% ShowLineage(); %> </div> </form> </body> </html> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class HelloWorld : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } public void ShowLineage() { Response.Write("Check out the family tree: <br> <br>"); Response.Write(this.GetType().ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.BaseType.ToString()); Response.Write(" which derives from: <br> "); Response.Write(this.GetType().BaseType.BaseType.BaseType.BaseType.ToString()); } }
在Visual Studio 2010中创建FTP网站 |
在主菜单中依次选择“文件”|“新建”|“网站”命令。在“Web位置”组合框中选择“FTP”。该选项适合创建最终通过FTP协议部署的网站 |
在Visual Studio 2010中创建HTTP网站 |
在主菜单中依次选择“文件”|“新建”|“网站”命令。在“Web位置”组合框中选择“HTTP”。该选项适合创建在整个开发期间将IIS作为Web服务器的网站 |
在Visual Studio 2010 中创建基于文件系统的网站 |
在主菜单中一次选择“文件”|“新建”|“网站”命令。在“Web位置”组合框中选择“文件系统”。该选项会使网站使用Visual Studio 内建的Web服务器。这样可以在计算机未安装IIS的情况下开发网站 |
3. 页面呈现模型
3.1 将控件呈现为标签
4.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 5. <html xmlns="http://www.w3.org/1999/xhtml"> 6. <head> 7. <title>Untitled Page</title> 8. </head> 9. <body> 10. <h2> 11. Page in HTML</h2> 12. <form method="post" action="BuchOfControls.htm" id="Form1"> 13. <label> 14. Type in me</label> 15. <input name="textinfo" type="text" id="textinfo" /> 16. <br /> 17. <select name="selectionitems"> 18. <option value="Item 1">Item 1</option> 19. <option value="Item 2">Item 2</option> 20. <option value="Item 3">Item 3</option> 21. <option value="Item 4">Item 4</option> 22. </select> 23. <br /> 24. <input type="submit" name="clickme" value="Click Me!" id="clickme" /> 25. </form> 26. </body> 27. </html> 28. 29. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 30. <html xmlns="http://www.w3.org/1999/xhtml"> 31. <head> 32. <title>Untitled Page</title> 33. </head> 34. <body> 35. <h2> 36. Page in Classic ASP</h2> 37. <form> 38. <label> 39. Type in me</label> 40. <input name="textinfo" type="text" id="textinfo" /> 41. <br /> 42. <select name="selectionitems"> 43. <option value="Item 1">Item 1</option> 44. <option value="Item 2">Item 2</option> 45. <option value="Item 3">Item 3</option> 46. <option value="Item 4">Item 4</option> 47. </select> 48. <br /> 49. <input type="submit" name="clickme" value="Click Me!" id="clickme" /> 50. <p> 51. <% if(Request("textinfo") !=""){ %> 52. This was in the text box: 53. <%=Request("textinfo") %><br /> 54. And this was in thie selection control:<%Request("selectitems") %> 55. <%} %> 56. </p> 57. </form> 58. </body> 59. </html> 60.
3.2 将界面元素包装成组件
3.2.1 ASP.NET页面
4 <%@ Page Language=C# trace=true %> 5 6 <script type="text/C#" runat="server"> 7 protected void Page_Load(object sender, EventArgs ea) 8 { 9 if(!IsPostBack) 10 { 11 ddl.Items.Add("Item 1"); 12 ddl.Items.Add("Item 2"); 13 ddl.Items.Add("Item 3"); 14 ddl.Items.Add("Item 4"); 15 } 16 } 17 </script> 18 19 <h2> Page in ASP.NET </h2> 20 21 <form id="Form1" runat="server" > 22 <asp:Label Text="Type in me" runat="server" /> 23 <asp:TextBox id="textinfo" runat="server" /> 24 <BR> 25 <asp:DropDownList id="ddl" runat="server" /> 26 <BR> 27 <asp:Button id="clickme" Text="Click Me!" runat="server" /> 28 </form> 29 30
3.1.2 页面的呈现模型
Trace 属性被设为True 时,ASP.NET 会记录请求和响应的整个上下文。
<%Page Language=”C#” Trace=”true”%>
3.1.3 页面的控件树
3.3 使用Visual Studio 添加控件
使用Visual Studio 构建一个页面
在ASPX的“源”视图和“设计”视图之间切换 |
切换到“设计”或“源”选项卡,他们通常显示在编辑器窗口的左下角。也可以使用“拆分”选项卡来同时显示“源”和“设计”视图 |
在页面中添加服务器端控件 |
打开“工具箱”。如果该窗口没有被显示,可以在主菜单中一次选择“视图”|“工具箱”选项。(也可以使用组合键Ctrl+W,X。) 在“工具箱”中单击该控件,并将其拖放到页面上 |
修改页面上控件的属性 |
确保页面设计器处于“设计”模式。选中要编辑属性的控件。 在“属性”窗口中修改目标的属性 |
启用跟踪 |
在“源”代码编辑模式下,为Page指令添加Trace=“true”属性。 或者 在“属性”窗口顶部选中DOCUMENT 元素,将Trace 属性设置为True |
修改服务器端控件的大小 |
选中该控件,用鼠标拖动控件边框上的手柄,知道将控件调整到合适大小 |
为控件的默认事件添加处理程序 |
双击要添加事件处理程序的控件。此时会显示代码编辑器,可以为此事件的处理程序添加代码 |
修改页面的布局方式 |
在主菜单上依次单击“格式”|“新建样式”命令。在“类别”中选择“布局”,在右侧定义样式(除布局外,还可以定义字体样式和页边空白等属性)。该样式可以应用到整个页面,业可以应用到单个元素。 |
4 自定义控件
4.1 Control类
Page类主要的属性、方法和事件
成员 |
说明 |
Application |
当前请求的HttpApplicationState对象的引用 |
Cache |
应用程序缓存的引用,缓存即内存中应用程序范围的状态字典(通常用于优化) |
Controls |
Page维护的控件集合 |
CreateChildControls |
页面创建其控件树时调用的虚方法 |
Init |
指示页面已被初始化的事件 |
IsPostBack |
用于判断当前请求是新的请求或回发的属性 |
Load |
指示页面已加载的事件 |
Request |
引用的是一个有状态对象,代表传入的请求 |
Response |
引用的是一个有状态对象,代表传出的响应 |
Session |
引用的是一个有状态对象,其中包括针对当前请求的信息 |
Unload |
指示页面已经被卸载的事件 |
4.2 Visual Studio 与自定义控件
创建自定义控件
在主菜单中依次选择“生成”|“生成解决方案”,生成项目。
通过编译后,Visual Studio 便自动将其添加到“工具箱”中,供主项目使用。
4.3 回文验证器
构建一个回文验证器
4.4 HtmlTextWriter与控件
5 //HtmlTextWriter 6 if (this.CheckForPalindrome()) 7 { 8 output.Write("This is a palindrome: <br>"); 9 output.RenderBeginTag(HtmlTextWriterTag.Font); 10 output.AddStyleAttribute(HtmlTextWriterStyle.Color, "blue"); 11 output.RenderBeginTag(HtmlTextWriterTag.B); 12 output.Write(Text); 13 output.RenderEndTag(); // bold 14 output.RenderEndTag(); // font 15 } 16 else 17 { 18 output.Write("This is NOT a palindrome: <br>"); 19 output.RenderBeginTag(HtmlTextWriterTag.Font); 20 output.AddStyleAttribute(HtmlTextWriterStyle.Color, "red"); 21 output.RenderBeginTag(HtmlTextWriterTag.B); 22 output.Write(Text); 23 output.RenderEndTag(); // bold 24 output.RenderEndTag(); // font 25 } 26 output.Write("<br>"); 27
HtmlTextWriter类和相应的枚举掩盖了HTML3.2和HTML4.0之间的差异。根据不同版本生成对应HTML。
4.6 控件与视图状态
使用ViewState
ViewState["Text"] = value;
string text = value;
this.alPalindromes = (ArrayList)this.ViewState["palindromes"];
if (this.alPalindromes == null)
{
this.alPalindromes = new ArrayList();
}
if (this.CheckForPalindrome())
{
if (PalindromeFound != null)
{
PalindromeFound(this, EventArgs.Empty);
}
alPalindromes.Add(text);
}
ViewState.Add("palindromes",alPalindromes);
新建呈现过程可控的自定义控件 |
从System.Web.UI.Control派生一个类。重写RenderControl方法。也可以使用Visual Studio中的一种名为“ASP.NET服务控件”的项目类型 |
将自定义控件添加到“工具箱” |
打开“工具箱”(如果其尚未被显示,可以在主菜单中一次选择“视图”|“工具箱”)。在“工具箱”的任意位置单击右击键,然后在快捷菜单中单击“选择项”。从列表中选择该控件,或通过浏览包含该控件的程序集来添加 |
修改页面上控件属性 |
确保页面的编辑器处于“设计”视图。选择目标控件,并在“属性”窗口中编辑所要修改的属性 |
管理页面上所有控件所引发的事件 |
确保页面的编辑器处于“设计”视图。选择目标控件,在事件窗口中选择所要处理的事件(单击“属性”窗口上端的闪电图标)。可以通过双击它来使Visual studio 插入相应的处理程序,也可以直接输入处理程序的名称 |
存储特殊的视图状态信息 |
确保所要存储的数据类型是可序列化的,并使用空间的ViewState属性(一种键/值集合)。在获取之前存储的信息时,应确保使用系统的索引值/键 |
编写与浏览器版本无光的呈现代码 |
使用HtmlTextWriter的标签呈现方法来插入标签,而不要硬编码。ASP.NET会根据浏览器的标头信息来决定将哪种HtmlTextWriter传入RenderControl |