ASPNET快速入门.ppt
内容:掌握基于ASP.Net的Web开发,B/S结构原理、ASP.Net内部原理、状态管理(Cookie、Session、ViewState等)、数据验证、普通ASP.Net控件、母版、ListView/Repeater等数据绑定控件、AJAX、缓存、Membership、导航、自定义控件等。目标:以应用为目标,能够使用ASP.Net开发常见的动态网站功能,并且和Dom、JQuery等客户端技术结合进行网站的开发。参考书:ASP.NET 3.5 揭秘注意:原理先行,对于ASP.Net来说弄明白了原理才能学得更快。会讲一些原理性的非常规用法代码,用标识,不要学这种写法。Java班先讲Servlet再讲JSP,.Net也是先讲HttpHandler再讲WebForm。,课程安排,第一阶段:原生控件和.NET内部对象 1、目标:从网络的角度介绍 ASP.NET 的工作原理,并对 ASP.NET 中的几个核心对象与 HTTP 之间的关系进行分析。掌握WEB运行请求响应原理,核心对象及服务器页面生命周期。2、项目:GSSMS【绿色简单学生管理-原生版】第二阶段:服务器控件提高开发效率 1、目标:掌握服务器端控件的使用及控件生命周期。2、项目:GSSMS【绿色简单学生管理-服务器控件版】第三阶段:ASP.NET高级进阶 1、目标:掌握缓存/Ajax/Json/母板页/错误页/网站部署/CKFinder,我们怎么看到网站的?,1、在地址栏输入地址敲回车后浏览器到底做了什么事情?,服务器与浏览器语言,1.浏览器与服务器语言 浏览器只负责解释执行html+css+javascript代码 服务器可执行服务器端语言:.NET,JAVA,.,分别由不同的运行 环境执行代码(Framework,JVM)2.静态页面(html)和动态页面(aspx)的区别?比如说新闻列表页面(邮箱列表)。,浏览器:htmljavascriptcss,服务器:?HTML(.html).Net(.aspx.ashx)JAVA(.jsp)PHP(.php),编写代码演示静态页面和动态页面,ASP.NET里的常用文件(重点),下面来编写一个登录的动态页面让各位加深体会,登录流程,用户打开登录页面,填入用户名密码,点击【登录】按钮,浏览器将用户输入的用户名、密码发送给网站服务器,网站服务器让负责处理登录请求的ASP.Net程序来处理这个登录请求,处理程序判断用户名、密码是否正确,然后将判断结果返回给浏览器。开发一个登录页面需要做两个工作:1.显示在浏览器中的页面、Dom特效,和C#代码没关系,也就是前端(前台)页面,相当于这个页面要生成的HTML代码模板;2.处理浏览器请求的服务器端代码,C#代码,也就是后台代码。,画图区分第一次请求和之后的提交,什么是ASP.Net,ASP.Net是一种动态网页技术,在服务器端运行.Net代码,动态生成HTML。可以使用JavaScript、Dom在浏览器端完成很多工作,但是有很多工作无法在浏览器端完成,比如存储数据、访问数据库、复杂的业务逻辑运算、安全性要求高的逻辑运算等。服务端控件和HTML控件的生成关系:在aspx页面中可以使用服务端控件,简化开发。但浏览器只认html,因此在包含服务端控件的页面被请求时,页面中的服务器端控件会组装成对应的HTML控件代码字符串,如:TextBox。ASP.Net:WebForm、MVC。服务器控件不是新的控件,在浏览器端仍然是生成html标签。服务端控件虽然好用,但是也有缺点,并不是什么地方用服务器端控件都好,具体后面讲。,Web应用程序和网站,WebApplication(Web应用程序)和WebSite(网站)的区别,WebSite是为了兼容从ASP转过来的开发人员的习惯而存在的,用起来简单,比如不需要创建命名空间、CS代码修改以后不需要重启就能看到变化(无论是WebSite还是WebApplication,修改aspx都不需要重启。WebApplication每次修改以后点击【生成解决方案】也能立即看到修改效果),但是不利于工程化开发,比如代码出错不容易发现,代码不分命名空间。开发技术上没有任何区别,只是开发、调试习惯不同而已。方便开发不用每次调试都设定起始页,在项目的选项中设定【Web】启动操作当前页面,这样当前激活的页就是起始页。此次课程知识使用WebSite;,ASP.Net工作概要流程图,练习,练习:做一个加法计算器步骤:1.新建网站2.添加新建项-Web窗体(Cul.aspx)3.打开Cul.aspx,进入设计视图,从工具栏选择控件拖入到页面适当的位置(可以使用适当的HTML代码布局-Table)4.双击按钮,生成点击事件(和WinForm程序生成点击事件一样)5.在按钮点击事件中编写代码,接下来进入核心程序:一般处理程序,第一个网站-新建网站,第一个网站,注意:1.选择C#2.空网站3.文件夹,第一个网站-添加新项,在网站上点击右键,选择【添加新项】:,第一个网站-选择一般处理程序,第一个网站-编写代码,FirstShow.ashx(一般处理程序),第一个网站-在浏览器查看,1.在要查看的文件上单击右键,选择 在浏览器中查看。,2.注意到屏幕右下角状态栏中出现了一个小图标:Cassini服务器是vs内置的开发用的小型服务器程序我们待会在浏览器看到的页面就是由它处理并返回的。,第一个网站-访问结果,显示:终于降临到这个神奇的国度了!,刚才俩家伙做了什么?(请求响应的过程),1.用户在浏览器地址栏输入:http:/localhost:80777/FirstShower.ashx,2.服务器接收到用户的请求,发现是请求.ashx文件,便将请求交给framework执行,fw找到对应的文件login.ashx,执行后将生成的字符串(通常是html+css+javascript格式)返回给浏览器。,3.浏览器接收到服务器返回的数据,并按照语法解释执行,以界面的方式展示给用户看到。,(3.1此时如果html等代码中包含外部文件,则再次发送单独请求服务器相应文件数据),First.ashx,那如何理解B/S结构的原理呢?最好的办法就是我们自己做一个服务器程序,浏览器和服务器到底是什么东东?,如果我们自己来编写一个浏览器和服务器程序,该怎么做?就好像打电话一般咱们用中文还是用英文?(约定通信的语法)准备好要说的话(按照语法准备要传输给对方的数据)拨通电话(建立连接)通过电话机/电话线说话(通过互联网传输数据)注意:两个人都得拿对话筒(通信双方关注接收对方的数据)总结:浏览器:一个可以通过HTTP协议向服务器发送各种请求,并对从服务器发来的超文本信息和各种多媒体数据格式进行解释、显示和播放。服务器:一个管理资源并为用户提供服务的计算机软件。交互时使用HTTP协议。,只能被浏览器请求吗?,HTTP请求详解图,先来结合刚才的网页程序了解一下HTTP请求过程,OurHttpServer-咱自己的服务器程序,浏览器和服务器本质上就是两个使用Socket进行基于HTTP协议的通信的两个应用程序(我们使用WinForm)。咱自己做个服务器程序要解决的问题:-1.怎么接收浏览器的请求?接收以后怎么理解?0.怎么向浏览器发送响应?发送后浏览器怎么理解?1.如何对静态页面(html/css/javascript)的请求做出响应?2.如何对动态页面(ashx/aspx)的请求作出响应?动态文件可是有很多的,使用什么方式来调用呢?3.如何对图片文件(jpg/gif)的请求作出响应?4.如何保存状态?,OurHttpServer-咱自己的服务器程序,解决思路:1.使用套接字进行数据交换。2.使用HTTP协议(到底什么是HTTP协议?)的数据,双方按照此协议解释理解接收到的数据。3.直接读取静态文件的数据并通过套接字发送。4.对于动态文件的请求,可以通过分析请求页面,并反射所对应的类,并通过接口调用类的方法。,那么,在ASP.NET中,是怎么解决这些问题的?,咱来依次举个例子。大家自己看10分钟。,HTTP协议消息结构图,浏览器,服务器,请求报文,响应报文,FirstShow.ashx,ashx?HttpHandler(一般处理程序),请求上下文对象(此次请求处理要使用到的信息和对象都在里面),被访问时被调用的处理方法。是不是想起:窗体加载事件了:void Form1_Load(object sender,EventArgs e),服务器响应属性(调用HttpResponse对象),是否重用(暂时用不着,不用理),重要接口,HttpHandlers在A处理的位置(终点),请求管道(由N个过滤器组成),把处理过程看成一个黑盒子,我就知道你们想听.,一般处理程序(HttpHandler),一般处理程序(HttpHandler):是一个实现类接口的类。任何一个实现了IHttpHandler接口的类都能作为一个外部请求的目标程序。先演示一下ASPX页面。我们可以把一个HttpHandler看作是一个请求的终点。最常见的是ASP.NET页面。当用户请求一个.aspx页面时,请求将被页面交给页面Handler处理。咱可以通过创建一个我们自己的HttpHandler程序来生成浏览器代码发送回客户端浏览器。,如何接收和向发送客户端数据?,服务器怎么接收和发送数据?,服务器怎么接收?,服务器怎么发送?,ASP.NET系统对象,在一般处理程序里,通过ProcessRequest方法的参数HttpContext context调用,一、浏览器提交数据方式?(例)1.表单:(数据藏在请求报文体中,格式:txtname=james,Request(HttpRequest)&Response(HttpResponse),注意:使用表单提交时必须为控件设置name,画图,浏览器请求属性,增删查,1.列表2.删除3.新增,Request(HttpRequest)常用成员,页面间传递数据的几种方式?如何获取传递过来的数据呢?,Request,Form 属性,Params 属性,QueryString属性,获取通过URL路径传来的数据,获取通过表单提交传输的数据,客户端提交的数据集合,代码演示各种传值方式,Response(HttpResponse)常用成员,Response 允许开发人员对当前页面的输出流进行操作,Response,Redirect方法,Write方法,直接在页面上输出内容,重定向到另外一个页面,Response.Redirect(http:/);,Response.Write(Hello,China!);,End方法,结束输出,自己动手写动态网站,入门1.html 新建一个【一般处理程序】入门1.ashx,ProcessRequest中写context.Response.ContentType=text/html;string username=context.Requestusername;context.Response.Write(username+你好+Guid.NewGuid();每当用户请求访问ashx页面的时候,ProcessRequest方法就会被调用,在这里通过访问context.Request获得访问者的请求参数等。然后在ProcessRequest中通过context.Response向浏览器发回数据给浏览器。ProcessRequest结束之时就是服务器为这个浏览者本次访问服务完成之时浏览器向服务器端提交数据,被提交数据的表单(input、select、textarea等)放到form中,form中通过action属性设定表单被提交给哪个页面,为了在服务端取出表单项的值,需要在HTML中为表单元素设定name属性,注意id是给JS操作Dom用的,name才是提交给服务器用的。在服务器端用context.Requestusername来根据表单项的name来获得提交的属性值。通过向浏览器输出处理后的显示HTML内容。,注意,当我们点击【提交】按钮以后是浏览器将用户填写的文本框等控件中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的这个页面。哪些标签的哪些值会被提交给服务器呢?将用户填写的内容提交到服务器有如下几个条件:只能为 input、textarea、select三种类型的标签。只有input(文本框、CheckBox等)用户才可能填写值,、等标签仅供显示用,没有提交到服务器的必要。只有value属性的值才会提交给服务器。以input标签为例,input标签有title、type、disabled等属性,但是这些属性都是供显示用的,用户并不能修改,只有value属性才是用户输入的属性,因此只有value属性的值才会被提交到服务器。标签必须设定name属性。学习Dom的时候我们知道如果要通过JavaScript操作标签,必须为标签设定Id。如果要将标签的value属性值提交到服务器,则必须为标签设定name属性,提交到服务器的时候将会以“name=value”的键值对的方式提交给服务器,多个键值对之间用&分割。除了单选按钮等少数标签之外,大部分标签的name的值不能重复。name是给服务器用的,id是给Dom用的。对于RadioButton,同name的为一组,选中的RadioButton的value被提交到服务器。放到form标签内。只有放到form标签内的标签才可能会被提交到服务器,form之外的input等标签被忽略。,“返回”提交页面,如果还想返回提交页面,那么需要自己绘制。context.Response.Write();并没有真的返回提交页面,只是看起来像罢了。,“返回”提交页面改进版,为了请求、返回的内容一样,将页面源码放到字符串常量中,模板中有一些待填值的占位符,第一次进入页面的时候就直接访问ashx,读取htm模板,将待填值占位符设置为空,然后输出到浏览器。为了区分是第一次直接进入页面还是点击提交以后重新进入ashx,在form中增加一个隐藏字段:,如果能够从Request中读取到ispostback=true就说明是点击提交以后重新进入ashx,否则就是第一次进入ashx。ispostback就是一个标志位。实现思路:在ProcessRequest中首先从Request中读取ispostback,如果读取到true,说明是提交进入的,就加载模板,并且进行占位符用计算后的值替换,否则就将模板中的占位符清空直接输出给浏览者。占位符找一个特殊的不会和其他字符串冲突的就行。代码见备注刚进入hello2.ashx的时候是直接向浏览器输出内容,用户在输出的内容中填入数值,再点击提交,服务器就知道“提交回来了”(PostBack)Http是请求、响应的模型,服务器不会来读取浏览器的网页,能够得到的就是客户端网页提交过来的数据。如果访问Hello2.ashx,多次点击刷新,都是“直接进入”如果提交表单,再多次点击刷新,都是“提交进入”疑?讨论:文本框上次输入的值在提交表单后又显示出来并不是理所当然的,是开发人员帮着读取提交上来的值然后渲染上去的。这就是ASP.Net中ASPX和CS的关系。IsPostBack是依赖于ViewState的,所以禁用了页面的ViewState,IsPostBack永远为False。演示aspx中的IsPostBack在刷新、重新输入地址等情况下的值。不是服务器去读取模板htm中的内容,而是读取用户的提交,比如可以直接敲入网址。可能的错误:先convert成int,再判断tostring是否为空。IHttpHandler就是一个很单一的“读取请求参数、发回响应给浏览器”的处理程序,没有其他“超能力”,表单提交方式:Get与Post,还可以设定的method属性指定表单提交方式,get(默认值)是通过URL传递表单值,post传递的表单值是隐藏到http报文中,url中看到不。get和post的区别(常考):get是通过url传递表单值,post通过url看不到表单域的值;get传递的数据量是有限的,如果要传递大数据量不能用get,比如type=“file”上传文章、type=“password”传递密码或者发表大段文章,post则没有这个限制;post会有浏览器提示重新提交表单的问题,get则没有(加分的回答)。对于Post的表单重新敲地址栏再刷新就不会提示重新提交了,因为重新敲地址就没有偷偷提交的数据了。Post方式的正确的地址很难直接发给别人。Get方式URL数据格式。服务端文件名后跟着“?”,由于客户端可能向服务器端提交多个键值对,键值对之间用“&”进行分割,如果URL中有汉字、特殊符号等,则需要对URL进行编码。表单域只有设定了name的才会被提交给服务器(用get方式看的清楚)。如果给submit按钮设定name,那么按钮的value也会被提交给服务器【刷新】。,对比查看post/get报文数据,数值自增,实现input的自增:点击按钮input中的值自动增加,代码见备注。点击刷新就一直是值不变,只有点击提交才会变,分析原理。用开发人员工具篡改文本框的值自增就从新的值开始了。使用aspx重写input的自增。练习:加法计算器。常见错误:把htm设置成了起始页。type=submit才会自动提交表单,type=button不会自动提交。从ashx启动和从htm启动的区别为什么单使用div在服务器取不出来值呢?因为不是服务器来读取客户的网页,而是浏览器收集客户在表单中输入的字段,然后形成请求参数发给服务器处理程序,由于没有把div当前的innerText发给服务器,所以服务器无法得知当前的值。也不要幻想有办法能将div的innerText提交给服务器,因为只有设定了name的input、textarea、select的value属性值才会被提交给服务器。实现div内文本的自增。因为服务器不记得上次给浏览器的值是什么,而且不像input那样会将上次的值重新提交回来,因此浏览器需要用一个隐藏字段将上一次的值保存下来。代码见备注http无状态,每次请求都是由一个新的页面对象来处理请求。如果把value搞成static可以实现,但是两个用户访问的话就会串了。而用Input方式的话两个人各自点各自的,不会互相影响。非表单元素无法将客户端的元素值传递给服务器端,即使是表单元素也只能传递value值,对于其他属性值比如背景颜色、大小等也是无法传递的,因此对于这些值都要存在隐藏字段中。这就是ASP.Net中ViewState的实现原理。其实div中的只是起到显示作用而已,使用IE的“开发人员工具”修改div的innerText,然后点击按钮发现值并没有按照我们修改以后的递增。而修改input版本的则有效果。,每次都重新构建页面代码是不是很麻烦?,HttpHandler实现图片上传,一、浏览器端1.表单元素使用 文件选择框 控件。2.表单设置enctype二、服务器端1.服务器接收客户端上传的文件使用Request.Files属性。2.使用HttpPostedFile的SaveAs方法将图片保存在服务器。,HttpHandler实现动态图片输出,HttpHandler是对请求的响应,可以输出普通的html内容,也可以输出图片、也可以输出一个文件(下载)输出一幅动态创建的图片(能看懂就可以)案例1:图片中显示访问者信息案例2:填入朋友的姓名就能生成恶搞的图片链接案例3:绘制图片水印练习:制作简单验证码图片网上看到的注册、登录时候的验证码也是动态生成的图片、55.la也是这样实现的原理。,HttpHandler实现文件下载,如果HttpHandler输出的是html/txt/jpeg等类型的信息,那么浏览器会直接显示,如果希望弹出保存对话框,则需要添加Headerstring encodeFileName=HttpUtility.UrlEncode(“生活大爆炸117.avi”);Response.AddHeader(“Content-Disposition”,string.Format(“attachment;filename=”0“”,encodeFileName);其中filename后为编码后的文件名。filename段为建议的保存文件名。练习:使用Handler为学员列表添加“下载学员附件”功能,ASP.NET第一阶段的第一部分结束,ASP.NET第一部分主要内容:主要内容:1.浏览器/服务器交互原理(请求/响应的过程)。2.浏览器-服务器-IIS-FrameWork(aspnet_isapi.dll)-IHttpHandler 的处理流程。3.Web网站和Web应用程序的区别(开始时和发布后)4.【一般处理程序】的使用(增删改查)和上传文件/动态输出文件数据5.上下文对象(HttpContext)的 重要属性:Response(负责向客户端输出),Request(包含所有客户端提交的数据)注意:不要老想着晚上熬夜学习,因为大部分人会有产生一种消极的时间心里暗示“玩一会儿吧,反正晚上有时间。”养成健康的生活习惯,逼自己在20:30前把代码方面的工作做完,提高效率。,HttpHandler实现文件下载,如果HttpHandler输出的是html、txt、jpeg等类型的信息,那么浏览器会直接显示,如果希望弹出保存对话框,则需要添加Header:string encodeFileName=HttpUtility.UrlEncode(“过滤词.txt”);Response.AddHeader(“Content-Disposition”,string.Format(“attachment;filename=”0“”,encodeFileName);其中filename后为编码后的文件名。filename段为建议的保存文件名。http报文中普通方法看不到的那些东西就是“报文头(Header)”练习:从数据库用户表导出数据到txt文件,让用户下载。练习:用户表增加一个级别字段。只有登录用户才能下载images下的图片文件(Session中标识是否登录),如果用户没有登录则首先重定向到登录界面让用户登录,用户登录成功则跳转到下载列表页面,下载链接固定写好即可。如果登录用户是普通用户则在图片左上角加上“免费用户试用”的字样。“安全退出”。画页面流程。常见问题:e.preventDefault;或者没写造成span闪的原因?不会保留上次设置的静态值。讲用静态页面只是讲原理,实际用大部分还是aspx。Single是怎么回事?练习:给上面的程序加上登录验证码。todo:ShowMsg页面3秒自动跳转;用户不能直接访问privateimages下的图片;如果程序源代码开放以后造成的程序的漏洞。,HttpHandler实现文件下载2,1、新增需求:增加一个ShowMsg.aspx页面,接受Msg、Url两个参数,分别是显示的消息和“点击继续”的链接地址。2、登录以后将登录的用户Id存入Session。3、在看图片页面的PageLoad总判断Session是否有登录用户Id,如果没有的话则重定向到ShowMsg.aspx页面,要求用户登录。Session只有和服务器长期不交互才会销毁。todo:ShowMsg页面3秒自动跳转;给上面的程序加上登录验证码。用户不能直接访问privateimages下的图片;如果程序源代码开放以后造成的程序的漏洞。怎么不能在alert后Redirect?怎么样才能在alert以后重定向?服务端控件也可以用Request“TextBox1”方式取值,虽然没必要,WebForm1,如果每次输出网页都直接用HttpHandler的话太痛苦了,所以一般生成html的时候都直接创建aspx(Web窗体,WebForm)。WebForm分为两个文件aspx和aspx.cs,aspx是页面模板,是页面描述文件,就是html的内容,和aspx结合的更好,不用像一开始那样程序员自己去填充模板,控件都是定义在aspx中,内联的JavaScript、CSS也是写在aspx中的,服务端的C#代码是定义在aspx.cs中。aspx控件页面长相,cs控制程序逻辑,这种“前aspx后cs”的方式就被称为CodeBehind。aspx就是模板引擎,不需要再去寻找第三方的模板引擎。浏览器如果报错“*行错误”,不要看aspx,要看生成的源代码,记事本如何定位行号,【转到】,WebForm2,cs可以调用aspx中的控件,aspx中也可以访问cs中定义的字段、函数,还可以编写复杂的C#代码,for等所有C#代码都可以写在aspx中(不推荐)前面 后面在当前位置输出表达式的值的时候使用,不要丢了=,相当于在当前位置调用Response.Write(UserName)使用的函数、代码相当于在这个位置调用函数、执行代码。注意aspx中调用cs的成员级别必须是protected或者public,不能是private的。中的代码是运行在服务器端的,是C#语法,在服务端运行完成才输出到浏览器,其他部分是运行在浏览器端的,是html、JavaScript语法。,HttpHandler的无状态,一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不要将状态信息保存到类变量中。编写一个ashxprivate int i;public void ProcessRequest(HttpContext context)context.Response.ContentType=text/plain;context.Response.Write(i+);多次刷新我们发现,变量根本不会记忆上次的值。如果每次响应都创建一个对象的话会非常消耗资源,因此服务器可能会对于多个请求重用一个对象,这样如果实现IHttpHandler的IsReusable方法返回true,那么就表示这个HttpHandler允许对象重用。一般返回true就可以。,投票页面,实现一个投票页面,页面中有“赞成”、“反对”两个按钮,点击“赞成”按钮则增加赞成数,并且在“赞成”按钮上显示最新的赞成个数,“反对”按钮同样如此。(*)同一个IP在24小时之内只能投票一次。讨论方案。,aspx、cs、dll之间的关系(*),聊、考CodeBehind的时候可以顺带吹的点。在WebForm的页面中执行下面的代码Response.Write(this.GetType()+);Response.Write(this.GetType().Assembly.Location+);Response.Write(this.GetType().BaseType+);Response.Write(this.GetType().BaseType.Assembly.Location+);发现当前执行页面的类名是ASP.webform1_aspx这样的类名,父类才是ASPNETTest1.WebForm1使用Reflector打开这个临时dll,反编译这两个类,发现ASPNETTest1.WebForm1是在VS中编写的aspx.cs类,而ASP.webform1_aspx则是一个继承自ASPNETTest1.WebForm1的子类,ASP.webform1_aspx代码是根据aspx内容动态生成的构建网页内容的类。综上,aspx最终也会生成一个类,这个类是继承自aspx.cs中的类。查看反编译以后的代码,可以看到就是编译生成了普通的.Net 代码。因为aspx生成的代码是cs类的子类,所以就明白了为什么“aspx中调用cs的成员级别必须是protected或者public,不能是private的。”,Page类成员,1、Request、Response、Server、Session属性:对context.Request、context.Response、context.Server的简化调用。2、AppRelativeVirtualPath属性:获得页面相对于应用根路径的路径,比如/Default2.aspx 3、FindControl(ctrlId),根据控件的id找到(服务器端)控件,类似于getElementById。一般情况下直接在代码中写控件id引用控件就可以了,但是对于有些场合:使用ListView等控件的模板、编写自定义控件等则需要使用FindControl来引用控件,FindControl返回值是Control(大部分控件的父类),一般需要显式转换为相应的控件:TextBox txtBox=(TextBox)FindControl(TextBox1);txtBox.Text=aaa;4、IsPostBack:看是True还是False就看浏览器是否提交了表单数据。5、ResolveClientUrl(url)将虚拟路径转换为客户端访问时的路径,比如ResolveClientUrl(/a/b.aspx)结果是a/b.aspx,这通常在ListView等控件的模板中输出HTML使用。基本就是对VirtualPathUtitlity.ToAbsolute简化调用。考虑当前页面的相对路径,生成的路径短。最常用。干净!6、ResolveUrl(url)将虚拟路径转换为相对于网站根目录的路径,比如ResolveUrl(/a/b.aspx)的结果是/WebSite4/a/b.aspx。不考虑当前页面,VirtualPathUtitlity.ToAbsolute直接转换为一个全路径。,回顾学过的开发模式(C/S)共同特点机器上需要安装JDK或者.Net Framework用户界面基于窗体事件驱动优点响应用户操作速度快界面元素丰富交互性强缺点客户端需要安装JDK或者.Net Framework客户端需要安装客户端应用程序典型应用:MSN,QQ,魔兽世界.,比较C/S和B/S,理解B/S开发模式(浏览器/服务器模式)特点:客户端需要安装浏览器软件IE,FireFox,Opera界面采用HTML,CSS,JavaScript等所有的处理一般在服务器进行可以采用JSP,ASP.NET,PHP等技术基于请求响应如同顾客和服务员的关系优点:客户端无需安装(一般操作系统都自带浏览器)只要连上Internet,可以访问服务器升级维护主要集中在服务器缺点:界面元素不够丰富交互性没有C/S模式强安全性问题比较突出,比较C/S和B/S,方便的VS内置轻量级服务器软件,在VS中,内置了轻量级的Web服务器Cassini(“卡西尼”)它不是IIS,只是开发的时候用的轻量级服务器,IIS有的很多功能它都没有。(人数限制,授权等),ASP.NET,VB.NET,C#,JScript,其他语言,Web 应用程序,丰富的语言支持,支持,_,编译,Microsoft中间语言(MSIL 或 IL),JIT 编译器,机器语言,代码的编译过程,C#源码,ASP.NET 服务器控件是在服务器上运行并封装用户界面及其他相关功能的组件,这些控件提供了各种属性、方法和事件,可简化构建强大的 Web 应用程序的过程,Web 控件,内部控件,数据绑定控件,扩展控件,验证控件,属于 命名空间,并派生自 WebControl 基类,强大的微软控件支持,使用和创建 Web 服务Web服务是通过标准Web协议访问的可编程的应用程序逻辑。它利用XML和HTTP作为信息通道的一部分,ASP.NET使其抽象化,使得构建基于SOAP的应用程序简单到只需编写应用程序逻辑。2.身份验证和授权机制:ASP.NET 与 IIS、.NET 框架和操作系统所提供的基础安全服务配合使用,共同提供一系列身份验证和授权机制,方便简单的WebService,状态管理:ASP.NET能够通过cookie、URL查询字符串、ViewState、Session等 进行有效的状态管理更高的可扩展性:可在单独的机器或数据库的单独进程中维护会话状态,从而允许跨服务器的会话配置和部署 将配置信息存储在基于 XML 的配置文件中,使得ASP.NET应用程序更易于部署;预编译代码,可在将代码正式部署前从源代码编译成IL中间代码部署到服务器上,一来可以保证代码安全;二来可以加快用户访问速度。,其它,