学习交流,欢迎转载。转载请注明文章来源:http://www.cnblogs.com/lgjspace/archive/2011/10/13/2218282.html
经验:
能在浏览器端完成的就在浏览器端实现,尽量不要往服务器端写一些用 JavaScript、DOM、JQuery 就可以轻松实现的代码。因为在服务器端运行的代码都要经历“在页面提交数据或信息到服务器端,然后服务器端处理后再反馈到页面”的过程,耗时间耗带宽耗服务器资源。需要在服务器端完成的功能如:数据存储、访问数据库、复杂的业务逻辑运算、高安全性要求的逻辑运算等。
细节:
1. 在ASP.NET中写的诸如 <asp:TextBox ID = "TextBox1" runat = "server"></asp:TextBox> 的看似 ASP.NET 中特有的标签其实并不是什么新鲜事,ASP.NET 的编译器在编译时还是把这些看似 ASP.NET 特有的标签翻译成普通的 html 标签,例如前面的标签会被翻译成:<input name = "TextBox1" type = "text" id = "TextBo1" />。
2. 在同一个aspx页面中,可以同时存在 ASP.NET 标签和 html 标签,互相不受影响,ASP.NET 编译器编译时只会把自己的标签翻译成 html 标签,不会对原本就是 html 标签的标签进行任何修改。
3. ASP.NET 标签之所以可以在服务器端用 C# 代码来进行操作,是因为 这些标签标记了“runat = "server" ”,如果普通的 html 标签中也标记了该语句,则该 html 标签也可以在服务器端进行操作,这种标记了“runat = "server" ”的普通 html 标签称作“runat server 的 html 控件”。
4. 所谓的 ASP.NET 控件只是对于服务器端来说,对客户端来说还是普通的 html 标签。
WebSite 和 WebApplication 的区别:
1. WebApplication 中当后台服务器端的 C# 代码有变更时,需要重新启动浏览器,才能看到变更后的效果;而 WebSite 则不用重新启动浏览器,直接简单刷新一下即可看到代码变更后的效果。
2. WebApplication 的代码默认带有 namespace ,而 WebSite 则没有,WebSite 里的代码是不区分 namespace 的。
3. WebSite 是为了兼容从 ASP 转过来的开发人员的习惯而存在的,ASP 不同于 ASP.NET,ASP 是解释性的语言。
4. WebSite 中每个 *.cs 文件都编译生成一个 DLL(Assembly),而 WebApplication 则把整个应用程序项目编译成一个 DLL(Assembly)。
5. WebSite (由于没有命名空间)不利于工程化开发,比如:(由于 WebSite 是运行时才报错)代码出错不容易发现。
细节:
在 VS 下可以把 WebSite 转换成 WebApplication,但有点理解不了,在 WebApplication 项目下右键点击会有“转换为Web应用程序”,反而在 WebSite 下没有。
细节:
aspx 和 ashx 都是处理程序,都是用来处理或操作客户端浏览器提交回来给服务器的请求的应用程序,只是 ashx 是最普通的一般处理程序,而 aspx 则是经过 ASP.NET 封装的 ashx。
细节:
客户端和服务器端的交互流程:
用户可以访问客户端 html 页面,通过对页面的操作来向服务器端的“处理程序”(ashx 或 aspx 文件)发出请求,“处理程序”对请求上来的表单进行操作或处理,处理完之后再往客户端页面发出响应。
重点:
1. 当一个客户端的 html 页面向服务器端的 ashx 处理程序提交请求,服务器端的 ashx 处理程序中的 ProcessRequest() 方法就会被触发。
2. 然而如果客户端的 html 页面是首次被打开,则 ProcessRequest() 方法就不会被触发。(不严谨,仅适用于打开的是 *.html 后缀的普通页面,而不是 *.aspx 或 *.ashx 等后缀的 ASP.NET 页面)
细节:
“一般处理程序”中的 ProcessRequest 方法中的 context 参数的 Request[] 是一个索引器,可以通过该索引器获取客户端 html 页面提交过来的表单内容,获取的方法是:Request[客户端页面表单中某个元素的 name 值],这样,返回的就是客户端页面表单中 name 值和 Request[] 里的 name 值对应的元素的 value 值。
注意:
凡是要提交给服务器端使用的表单元素,都必须要有“name”属性,否则服务器端无法使用该控件,而“id”则不强制要求。“name”是提交给服务器端时用的,服务器只认“name”,而“id”是在页面前端(的JavaScript,JQury,Dom)用的。
注意:
所有表单提交的都是以 name 为 key,value 为值的内容,其他属性是不会被提交到服务器的。
细节:
客户端的 html 页面中,如果需要把某些内容提交给服务器,这些内容必须被包含在 <form action = "处理程序的文件名,如:Hello.ashx"> </form> 标签中,而且该标签必须显式用 action 属性指定所要提交到的“处理程序”的文件名。
细节:
一般处理程序中的 ProcessRequest 方法中,代码“context.Response.ContentType = "text/html";”的“text/html”表示响应到客户端页面的内容的格式是 html 格式,而如果是“text/plain”则表示响应的内容的格式是 txt 格式。
技巧:
在 C# 中若需要输入多行的字符串且保存为多行的格式,可以在字符串开头的双引号前面加上“@”,这样就不用把多行的字符串重新调整回单行的格式了。
细节:
在 ashx 一般处理程序中不能直接用相对路径的字符串,可以通过使用“context.Server.MapPath(文件所在的相对路径)”来获得文件的全路径。
细节:
当用户第一次打开该网站的客户端 html 页面(无论打开后是否有手动刷新页面),IsPostBack 为 false,而当用户把这个页面提交给服务器(也无论提交给服务器后是否有手动刷新页面), IsPostBack 为 true。
细节:
Http 是请求、响应的模型,不会自己去读取客户端的页面信息,能读取的都是客户端页面提交回来给服务器端的表单内容。
方法:
通过 input 标签的隐藏 hidden 字段实现 IsPostBack 效果的方法:
在客户端的 html 页面中添加 hidden 字段,字段名为“isPostBack”,值为“true”,然后,在一般处理程序(*.ashx)里判断提交上来的表单的 isPostBack 字段的值是否为“true”,是则表示是提交表单进入,否则表示是初次直接进入。
原理:
客户端第一次打开页面时由于没有提交隐藏字段,直接向服务器初次请求客户端 html 页面,此时服务器中的“一般处理程序”中判断 isPostBack 的值不为“true”,所以判断为初次直接进入,此时用户提交表单给服务器;当用户再次向服务器提交请求时,由于此前已经提交过表单给服务器,而 isPostBack 属性也随着已经提交的表单中的隐藏字段提交到服务器,所以此时服务器获取到的 isPostBack 属性为 true,因此判断本次提交不是初次进入,而是 PostBack 进入。
区别:
1. 设定 <form ></form> 标签中的 method 属性可以指定表单的提交方式,默认为 get,是通过 URL 传递表单值,post 是把要提交的表单值隐藏到 http 报文中,在 URL 中看不到。
2. 通过 get 方式传递的数据量是有限的,如果要提交的数据量较大就不能用 get 而只能用 post 了。
3. 以 post 方式来提交表单的(不是首次打开的)页面,点击刷新时会有确认提示,用户体验不佳,而以 get 方式提交表单的页面则没有该问题。
细节:
在一般处理程序(*.ashx)的 ProcessRequest() 方法中,方法的参数 context 的 Request[] 索引器索引出来的都是字符串类型的结果内容。
重点:
在 ASP.NET 开发的网站中,客户端中打开的页面的地址一般都是 *.aspx 或 *.ashx 等以处理程序文件名为后缀的页面,而不是直接打开 html 页面,html 页面一般都是在后台服务器中作为模板来使用,就算是首次打开时也是先打开 *.aspx 或 *.ashx 等处理程序,触发处理程序中的 ProcessRequest() 方法,让处理程序返回的处理后页面响应到客户端的浏览器中,来实现对网页的初次渲染。
区别:
启动 html 文件和启动 ashx、aspx 文件的区别:
1. 如果启动 ashx 或 aspx 文件,程序会先触发 ashx 或 aspx 等处理程序中的 ProcessRequest() 方法,通过把运行该方法后返回的 html 页面内容响应到客户端的浏览器上来实现页面的渲染;而如果启动 html 文件,则程序只会直接地把该 html 页面原封不动地响应到客户端浏览器上。
2. 其实 ashx 或 aspx 文件对应的 html 页面文件一般都只作模板的用途,一般作为模板用途的 html 页面都禁止客户端的浏览器直接打开的,客户端打开的都是服务端提供的以 ashx 或 aspx 等为页面地址后缀的页面,其实本质上来说,应该是客户端触发“处理程序”(即 ashx、aspx 等),让该“处理程序”返回要打开的页面内容,然后把该内容发送(响应)到客户端的浏览器中。
细节:
一般处理程序(ashx文件)在 WebApplication 项目中右键单击弹出的菜单里没有“在浏览器中查看”、“浏览方式”、“设为起始页”等功能;而在WebSite项目中则有这些功能。