asp.net知识库系统 知识讲解

ASP.NET深入解析--详细介绍
图书书名 图书作者
图书书号发行号系列名
&当前位置:
ASP.NET深入解析
ASP.NET深入解析
作者:苏红超
书名:ASP.NET深入解析
定价:¥35 元
丛书名: &
免费资源下载:
配套光盘提供相关资料/课件/素材等
本书PPT下载:
目录和样章下载:
模拟试题库下载:附带光盘
教学资料包下载:附带光盘
实例素材下载:附带光盘
标准书号:&7-03-
字数(千):&593
出版日期:&
发行号:&TP-2173
点击热度:&16457
习题答案下载:附带光盘
教学视频下载:附带光盘
电子教案下载:附带光盘
.........................................................................................
.........................................................................................
.........................................................................................
本书是一本比较深入探讨ASP.NET技术的中高级读物。书中通过详尽的实际范例,深入讲解了ASP.NET技术的重点内容,结合ASP.NET技术探讨了有关面向对象、设计模式、架构设计和多层开发方面的技术知识,以便读者学完本书后能更好地利用ASP.NET技术设计、开发出更具竞争力的企业级软件产品。
本书通过3个部分循序渐进地讲解ASP.NET的重点核心技术,由浅入深的讲解方式会使读者更顺畅地学习ASP.NET高级技术。
本书适合于对ASP.NET技术感兴趣的中高级读者,以及希望采用ASP.NET技术构建企业级应用软件的开发人员。
.........................................................................................
自从微软公司正式公布庞大的.NET战略以来,短短的两三年间,它已经迅速成为企业级的应用和开发平台,而.NET技术的发布也带来了Web开发技术的革命性进步。ASP.NET作为一种划时代的Web开发技术,随着.NET平台的提出而问世,它提供的事件驱动编程模型是以往任何一个Web开发技术所不具备的。ASP.NET技术使得Web开发不再局限于很小的领域,而是非常容易地扩展到如移动设备、Web语音程序等在以往的Web技术中不可想象的领域。
一、本书的写作目的
在ASP.NET技术推出之前,微软公司提供给广大开发者的Web开发语言是ASP,而其他公司也分别仿照ASP技术模式推出了如PHP、JSP等Web开发语言,但是这些Web技术都是嵌入型的脚本语言,从而在开发过程中显得凌乱不堪,并且完全违背目前主流的开发思想――面向对象的软件开发,以至于很多的Web开发者被称作“网页开发工程师”,而非“软件工程师”。
随着ASP.NET的问世,它提供了同常规软件开发一致的开发模型,同样采用事件驱动模式和Web&nbspForm开发模式,使得我们可以真正做到面向对象开发,从而可以实现更为强壮的企业级软件产品。而这些都是JSP之类的技术所不能拥有的特性。
在.NET平台下,ASP.NET的底层支撑技术平台是.NET&nbspFramework。在本书的撰写时,稳定的.NET&nbspFramework版本是1.0+SP2,开发.NET下应用程序的集成化开发环境则是Visual&nbspStudio&nbsp.NET&nbsp2002,书中所有的代码范例都是在此环境下调试运行通过的。
微软公司近期发布了.NET&nbspFramework&nbsp1.1以及Windows&nbspServer&nbsp2003,而Windows&nbspServer&nbsp2003则是微软公司第一个内置了.NET&nbspFramework基础构件的操作系统,也为.NET的更进一步普及铺平了道路。在本书的部分章节中,也对.NET&nbspFramework&nbsp1.1与.NET&nbspFramework&nbsp1.0之间的差异作了一定的说明。
ASP.NET同以往技术一个最大的不同还在于它的面向对象特性。本书全部采用C#来讲解,作为Web开发软件工程师,所关注的应不仅是各种编程技巧,更多的还要关注提纲挈领的东西。
作为软件工程师,在使用ASP.NET技术开发软件产品时,更多注意的是如何实现真正面向对象的开发,以及如何做到更好的组件化开发,本书结合ASP.NET技术探讨了有关面向对象、设计模式、架构设计、多层开发方面的技术知识,以便读者能利用ASP.NET技术设计开发出企业级的软件产品。
二、本书结构与导读
本书分为3篇11章,循序渐进地介绍了ASP.NET技术方面的相关知识,包括面向对象、设计模式和多层开发等技术,从而使得读者能从更高层次去应用ASP.NET技术。希望本书能对读者在软件架构设计和面向对象软件开发等方面起到帮助作用。
本书结构如下。
第一篇&nbsp&nbsp基础知识
这一篇主要介绍了ASP.NET技术的基础知识和企业级应用的基础知识,包括如下几章。
第1章详细描述了有关.NET和ASP.NET技术框架的知识,可以让读者能清晰地了解到ASP.NET的底层支撑环境方面的技术。如果读者已经对这方面的知识有比较清晰的了解,可以直接跳过本章。
第2章主要讲解了有关ASP.NET开发方面的环境配置细节。如果对ASP.NET开发环境的配置非常熟悉,可以直接跳过本章进行下一章的阅读。
第3章详细讲解了面向对象的基础知识,以及有关软件过程(如RUP、XP等)、设计模式和架构设计方面的基础知识。希望读者不要错过本章的内容。
第二篇&nbsp&nbsp深入解析
这一篇主要深入地讲解了ASP.NET在企业级应用中的几个重点方向的技术运用,包括如下几章。
第4章详细并且深入地讲解了ASP.NET内部底层的核心技术,对于深刻理解ASP.NET技术有很大的帮助。希望每一位读者能仔细阅读本章节。
第5章详细讲解了如何利用ASP.NET技术进行数据访问操作。
第6章介绍了ASP.NET&nbspWeb&nbspForm的知识。Web&nbspForm是ASP.NET的立命之本,不能很好地掌握它也就不能掌握ASP.NET技术,它也是ASP.NET技术的基础。
第7章讲述了如何在ASP.NET中实现Web&nbspService的开发和配置,也讲解了微软对Web&nbspService技术的最新支持,即WSE技术规范。
第8章详细地讲解了有关ASP.NET配置和安全缓冲方面的知识。
第三篇&nbsp&nbsp开发实战
这一篇给出了多个ASP.NET企业级开发中的典型应用的技术解决方案以及附录章节,包括如下几章。
第9章给出了多个在企业级应用中非常有用的技术解决方案。通过这些实际运用ASP.NET技术的例子,各位读者也能更直接和更具体地了解到如何使用ASP.NET来开发企业级应用。
第10章在综合了前面众多章节的基础之上,讲解了如何使用ASP.NET技术构建基于.NET平台的企业级应用系统的架构。对想更进一步提高的读者有很好的指导作用。
第11章给出了有关C#语言的基础知识,以作参考。如果对于C#有比较深的了解和掌握,可以直接跳过。本章也给出了一些非常好的技术站点,建议读者能够到此类站点浏览。
本书各个章节程序的源代码以及书中所探讨的一些软件开发包和建模软件的试用版本均已放在网站:上,读者可以参考使用。
三、本书的读者对象
本书是针对已经对于ASP.NET技术有所了解,但是仍然希望得到更进一步提高的中高级开发人员或者对于ASP.NET感兴趣的读者,本书针对的读者应当具备简单的C#编程基础。
四、反馈和交流
在本书的撰写过程中,要特别感谢张芳,她为本书提供了很多很好的建议,并做了很多后勤支持工作。
由于时间仓促,加之作者水平有限,本书不妥之处在所难免,希望广大读者不吝赐教,批评指正。
也欢迎各位读者随时通过电子邮件与作者交流,电子邮址是:。
.........................................................................................
第一篇&nbsp&nbsp基础知识
第1章&nbsp&nbspMicrosoft&nbsp.NET和ASP.NET技术框架
1.1&nbsp&nbsp.NET&nbspFramework技术架构
1.1.1&nbsp&nbsp.NET体系结构
1.1.2&nbsp&nbsp.NET&nbspFramework通用语言运行时
1.1.3&nbsp&nbsp.NET&nbspFramework基础类库
1.1.4&nbsp&nbsp.NET&nbspFramework的安装和设置
1.2&nbsp&nbspASP.NET技术架构
1.2.1&nbsp&nbspASP.NET技术平台纵览
1.2.2&nbsp&nbspASP.NET技术框架简介
1.3&nbsp&nbspXML&nbspWeb&nbspService和SOAP简介
1.3.1&nbsp&nbspXML简介
1.3.2&nbsp&nbspXML基本语法
1.3.3&nbsp&nbspXML架构定义语言简介
1.3.4&nbsp&nbspXSL简介
1.3.5&nbsp&nbspWeb&nbspService简介
1.3.6&nbsp&nbspSOAP简介
第2章&nbsp&nbspASP.NET开发环境配置
2.1&nbsp&nbspASP.NET开发环境的安装
2.1.1&nbsp&nbspASP.NET运行环境的安装
2.1.2&nbsp&nbspASP.NET开发环境的安装
2.2&nbsp&nbspASP.NET开发环境的配置
2.2.1&nbsp&nbspASP.NET开发环境的简单配置
2.2.2&nbsp&nbspVisual&nbspStudio.NET环境的简单配置
第3章&nbsp&nbsp面向对象知识
3.1&nbsp&nbsp面向对象基础知识
3.1.1&nbsp&nbsp面向对象软件开发简介
3.1.2&nbsp&nbsp面向对象设计和编程的基本原则
3.1.3&nbsp&nbsp面向对象的软件开发模式(需求、设计、编码、测试)
3.1.4&nbsp&nbsp常用的软件系统建模工具
3.2&nbsp&nbsp设计模式简介
3.2.1&nbsp&nbsp设计模式的基础知识
3.2.2&nbsp&nbsp23种基本设计模式介绍
3.2.3&nbsp&nbsp设计模式在架构设计中的应用
3.2.4&nbsp&nbsp.NET中的设计模式简介
第二篇&nbsp&nbsp深入解析
第4章&nbsp&nbspASP.NET&nbspFramework
4.1&nbsp&nbsp一个HTTP请求的生命周期
4.1.1&nbsp&nbsp回顾ASP时代的HTTP请求处理过程
4.1.2&nbsp&nbspASP.NET时代的HTTP请求处理方式
4.1.3&nbsp&nbsp深入ASP.NET&nbspFramework&nbspHTTP运行时
4.2&nbsp&nbspHttpModule是如何工作的
4.2.1&nbsp&nbspHttpModule在ASP.NET&nbspFramework中的位置
4.2.2&nbsp&nbsp构建自己的HttpModule
4.2.3&nbsp&nbsp深入了解HttpModule
4.3&nbsp&nbsp初次接触IHttpHandler
4.3.1&nbsp&nbspIHttpHandler是什么
4.3.2&nbsp&nbspIHttpHandler如何处理HTTP请求
4.4&nbsp&nbspIHttpHandler深入解析
4.4.1&nbsp&nbsp实现IHttpHandler接口
4.4.2&nbsp&nbsp实现IhttpHandler工厂
4.5&nbsp&nbsp深入ASP.NET事件模型机制
4.5.1&nbsp&nbspASP.NET事件模型初步认识
4.5.2&nbsp&nbspASP.NET的事件模型深入了解
第5章&nbsp&nbspASP.NET数据存取技术
5.1&nbsp&nbspADO.NET技术简介
5.1.1&nbsp&nbspADO.NET简介和数据访问技术的历史
5.1.2&nbsp&nbspADO.NET的新特性
5.2&nbsp&nbspADO.NET技术深入解析
5.2.1&nbsp&nbsp深入了解DataSet、Data&nbspReader以及数据存取技术
5.2.2&nbsp&nbsp编写可移植的数据访问程序
5.2.3&nbsp&nbsp深入了解ADO.NET的事务控制
5.2.4&nbsp&nbspADO.NET同XML的融合
5.3&nbsp&nbspXML数据存取技术简介(XML&nbspDOM&nbsp&&nbspXML&nbspSAX)
5.3.1&nbsp&nbspXML&nbspDOM简介
5.3.2&nbsp&nbspXML&nbspSAX简介
5.3.3&nbsp&nbspDOM技术和SAX技术的区别
第6章&nbsp&nbspASP.NET&nbspWeb&nbspForm
6.1&nbsp&nbspWeb&nbspForm简介
6.1.1&nbsp&nbspWeb&nbspForm编程机制
6.1.2&nbsp&nbspWeb&nbspForm同Win&nbspForm的区别
6.2&nbsp&nbspHTML&nbspServer&nbspControl和Web&nbspServer&nbspControl
6.2.1&nbsp&nbspHTML&nbspServer&nbspControl重要控件讲解
6.2.2&nbsp&nbspWeb&nbspServer&nbspControl重要控件讲解
6.2.3&nbsp&nbspHTML&nbspServer&nbspControl和Web&nbspServer&nbspControl的对比
6.3&nbsp&nbsp编写自己的User&nbspControl
6.3.1&nbsp&nbsp用户控件简介
6.3.2&nbsp&nbsp编写自己的简单用户控件
6.3.3&nbsp&nbspDHTML技术简介
6.3.4&nbsp&nbsp结合DHTML编写用户控件
6.4&nbsp&nbsp在Web&nbspForm中结合客户端脚本
6.4.1&nbsp&nbsp客户端脚本在Web&nbspForm中的位置
6.4.2&nbsp&nbsp在Web&nbspForm中控制客户端脚本
6.5&nbsp&nbspWeb&nbspForm代码重用
6.5.1&nbsp&nbsp代码绑定技术实现代码重用
6.5.2&nbsp&nbsp用户控件技术实现代码重用
6.5.3&nbsp&nbspCode&nbspBehind技术和User&nbspControl技术的比较
第7章&nbsp&nbspASP.NET&nbspWeb&nbspService
7.1&nbsp&nbspWeb&nbspService的前景
7.2&nbsp&nbspWeb&nbspService在ASP.NET中的具体实现
7.2.1&nbsp&nbsp利用Visual&nbspStudio.NET构建Web&nbspService
7.2.2&nbsp&nbsp手工构建Web&nbspService代理类
7.2.3&nbsp&nbsp实现ASP.NET下的Web&nbspService应用范例
7.3&nbsp&nbsp深入Web&nbspService中的SOAP和WSDL
7.3.1&nbsp&nbspSOAP同Web&nbspService的关系
7.3.2&nbsp&nbsp自定义SOAP&nbspHeader
7.3.3&nbsp&nbspWSDL技术规范简介
7.4&nbsp&nbsp深入Web&nbspService中的状态和事务管理
7.4.1&nbsp&nbspWeb&nbspService的状态控制
7.4.2&nbsp&nbspWeb&nbspService的分布式事务控制
7.5&nbsp&nbspWeb&nbspServices&nbspEnhancements技术
7.6&nbsp&nbsp使用WSE来传送一个非文本格式的文件
第8章&nbsp&nbspASP.NET配置、安全和缓冲机制
8.1&nbsp&nbspWeb.Config文件的配置
8.1.1&nbsp&nbspWeb.Config文件的作用
8.1.2&nbsp&nbspWeb.Config中重要小节的配置讲解
8.2&nbsp&nbspMachine.Config文件的配置
8.2.1&nbsp&nbspMachine.Config文件简介
8.2.2&nbsp&nbspMachine.Config的配置介绍
8.2.3&nbsp&nbspMachine.Config文件和Web.Config文件的差别
8.3&nbsp&nbspASP.NET页面配置标记
8.3.1&nbsp&nbspASP.NET页面标记的用途
8.3.2&nbsp&nbspASP.NET页面的重要标记讲解
8.3.3&nbsp&nbsp充分利用ASP.NET的页面配置标记
8.4&nbsp&nbspASP.NET中的安全管理
8.4.1&nbsp&nbspASP.NET中的身份安全验证机制
8.4.2&nbsp&nbspASP.NET中的安全配置
8.4.3&nbsp&nbspASP.NET的权限控制机制
8.5&nbsp&nbspASP.NET缓冲机制
8.5.1&nbsp&nbspASP.NET缓冲方式
8.5.2&nbsp&nbspASP.NET缓冲编程
第三篇&nbsp&nbsp开发实战
第9章&nbsp&nbspASP.NET高级应用开发
9.1&nbsp&nbspASP.NET分布式事务控制
9.1.1&nbsp&nbspCOM+事务控制简介
9.1.2&nbsp&nbsp在.NET下使用COM+服务
9.1.3&nbsp&nbspCOM+事务控制开发实例
9.2&nbsp&nbspASP.NET应用程序性能提升
9.2.1&nbsp&nbspASP.NET状态对象使用性能优化
9.2.2&nbsp&nbspASP.NET数据存取性能优化
9.2.3&nbsp&nbspASP.NET页面负载性能优化
9.2.4&nbsp&nbspWeb应用程序性能测试工具的使用
9.3&nbsp&nbspASP.NET开发活动目录
9.3.1&nbsp&nbspActive&nbspDirectory简介
9.3.2&nbsp&nbspActive&nbspDirectory管理工具的使用
9.3.3&nbsp&nbspActive&nbspDirectory在Windows&nbsp2000/XP中的管理作用
9.3.4&nbsp&nbsp.NET中对Active&nbspDirectory&nbsp的支持
9.3.5&nbsp&nbsp利用Active&nbspDirectory控制IIS
9.4&nbsp&nbspASP.NET中的私有程序集组件和全局程序集组件
9.4.1&nbsp&nbsp.NET下程序集简介
9.4.2&nbsp&nbsp实现私有程序集组件
9.4.3&nbsp&nbsp实现全局程序集组件
9.4.4&nbsp&nbsp程序集组件的密匙开发方式
9.5&nbsp&nbspASP.NET下开发Mobile应用程序
9.5.1&nbsp&nbspMobile&nbspInternet&nbspToolkit开发包简介
9.5.2&nbsp&nbspMobile&nbspWeb&nbspForms控件
9.5.3&nbsp&nbsp建立支持Mobile和PDA的ASP.NET应用程序
9.6&nbsp&nbspASP.NET下开发Web语音应用程序
9.6.1&nbsp&nbsp.NET&nbspSpeech&nbspSDK简介
9.6.2&nbsp&nbsp开发自己的Web语音应用程序
第10章&nbsp&nbsp基于.NET&nbspFramework的应用系统架构设计
10.1&nbsp&nbsp优秀的软件架构简介
10.1.1&nbsp&nbsp经典的Windows&nbspDNA架构
10.1.2&nbsp&nbsp.NET平台下的推荐架构
10.1.3&nbsp&nbspJ2EE架构简介
10.1.4&nbsp&nbsp.NET架构和J2EE架构的区别
10.2&nbsp&nbsp设计基于.NET的N层分布式架构系统
10.2.1&nbsp&nbspN层架构的历史回顾
10.2.2&nbsp&nbsp.NET下N层分布式架构的经典范例剖析
第11章&nbsp&nbsp附录
11.1&nbsp&nbspC#简要语法参考
11.1.1&nbsp&nbsp#基本数据类型
11.1.2&nbsp&nbspC#基本流程语句
11.2&nbsp&nbspASP.NET学习资料索引(网站)
11.3&nbsp&nbsp设计模式、架构设计学习资料索引
All Rights Reserved
地址:北京市海淀区北三环西路43号青云当代大厦21层2109&& 邮编:100086
站长QQ: Email: 电话:010-
版权所有:科学出版社 职教技术出版中心ASP.NET MVC的流程讲解
开始想这个标题的时候,很是忧郁到底叫什么标题会比较好哪,最后还是确定为讲解,虽然略显初级,但是很多概念,想通了还是比较有价值的。废话略过,开始!
1、MVC的基本开发流程
2、webform和MVC的选择
3、MVC的内部过程
1、MVC的开发流程
MVC的出现时微软在2009年左右开始提出的网站开发的新的发展方向,这个方面的开发官方解释是可以比较好的实现三层分离,而且分离之后,可以实现复用等相关好处,通常人们列举的例子是ui方面可以同时支持HTML网络或者WAP网络。但是其实个人的理解是,动态网站的开发经过不断地证实和发展,java的struts模型,可以提高开发速度,也可以降低差多,是比较好的框架,而微软也需要提供自己的开发框架。不能够只是一个界面一个界面的设计方式,设计模式逐步进入到了web开发的领域。
MVC使用vs2010进行开发时(这里介绍的是MVC2),首先需要选在一个模板,然后vs2010会帮忙创建好对应的目录结构。
每个目录的基本功能:
Content:主要用于描述css之类的资源
Controllers:主要就是controller的存放位置,创建controller时,都是需要在该目录创建的。
Models:主要就是entity的具体位置,以及跟entity相关的操作类
Scripts:javascript脚本存放的位置
Views:该部分主要是放置view显示部分的
Global.asax:目前来看,该部分主要就是路由设置
Web.config:该配置文件而已
从开发的流程方面来看,MVC的开发方式,或者说思考的方式出现了变化,在MVC当中,需要理解一个重要的点是:
Controller才是系统的中心,一切围绕Controller展开。
Model:所谓模型,可以理解为数据,这个数据可以是数据库中对应的表中的数据,这种数据是只有属性,而没有动作的,这种数据通常也被称之为Entity,即实体,除了这种数据之外,MODLE起始还要包括Interface,这些接口的目标是提供可以控制Entity的接口标准,然后在提供实现的载体,通常我们称之为Mock类,为了方便,可能我们还会在Model当中创建各种factory,从而简化对象的创建。
Controller:这个部分就是核心了,其实所谓核心,是说所有的处理,全部围绕着Controller展开,它的主要工作是访问model,获取数据后,将参数转发给view,然后让view表现出来。在这里主要完成的工作有两点:
1、在客户端访问一个页面后,需要跳转到Controller对应的action中去,然后在action中处理对应的view显示出来。
2、 完成客户的表单提交相应处理,也就是Form表单处理。(还记得之前讲过,对于HTML而言,只有Form表单实现了客户端的信息发送给服务端,然后由服务端处理相关的相应,因为MVC的设计目标就是放弃了微软原有的服务器控件,因此一切回归原始,采用HTML的form表单方式实现提交和相关的控制处理。)
View:顾名思义,该部分就是现实的部分,这个部分需要时刻记住的是,这个view虽然也是aspx的页面,但是已经发生了根本性的变化,不再有所谓的codebeind代码了,这个view的所有变成将采用混合式的变成,你会注意到这个部分的变成变为HTML与C#的混合,会出现很多的类似的代码。很多人起始对这个部分有不同的开发,混合代码对于分层不利,但是在MVC中,因为不涉及逻辑,所以view的表现变得简单,混合编程会变为可以接受的处理方式。另外,这种方式带来的好处是,美工可以介入了,他们的修改对于程序员来说,没有什么特别,也是非常容易直接引入的。带来的坏处是Gridview这种强大的服务器控件被丢弃了。虽然是这样,但是我个人觉得,这是回到了web开发的本质。他的思想,与JSP,PHP等等变为一致。
Golabal.asax:路由表,这个部分就是所谓的全局路由表。在MVC框架中,之所以实现了MVC功能,一个重要的概念是路由表,该部分实现了地址访问的动态,不再提供具体页面的访问模式。
注意:给我的感觉是,记住在view目录和model目录中,添加子目录,每个controller对应的view,都是一个目录下的view。这个是MVC框架查找时自动搜索的。
2、webform和MVC的选择
这个部分的争论,我想从微软开始推出MVC框架后,大家就在不间断的讨论着,不同的人,给出的看法也是不同,就我个人而言,我觉得MVC才是未来趋势,是世界最后大同的根本。尽管web form的模式,是微软开创性的创造,但是毕竟web开发不是微软首创,很多时候,大势所趋而已。我这里只是想谈谈两者的思想出发点的差别:
webform模式,这个模式的思维基础,是微软在桌面开发中取得了前所未有的成功,这些成功,微软希望复制到网络开发中,何为form,就是窗口开发,这种框架的逻辑是所见即所得+事件处理,微软希望可以将web实现为桌面开发的模式,但是网络开发的基础是HTML和HTTP协议,这两个部分带来的问题是HTML表现元素有限,并且只能够通过form与后台服务器通信。另外,HTTP协议无状态,无法实现消息机制,为了解决这些问题,微软创造了新的开发模式,引入ASP.NET服务器控件,实现了丰富的控件,通过postback回传机制,实现了事件模型,通过codebehind技术实现web页面与C#代码的分离。上述技术,的确非常成功,也确实很大程度上简化了web的开发,但是随着发展,带来了问题,就是webform的开发基础是页面化的,这种思维模式是说你开一个页面,然后在这个页面写响应事件,但是这种模式对于频繁变化的web程序缺乏良好的复用性,并且,前端人员开发的界面,往往在合成时,需要重做,这是微软自己创造的困难,这是一种以Page为中心的开发思想。
MVC模式,这个模式的思维基础,是分工清晰,以Controller为核心,在开发时可以先做model再做Controller,最后做view,通过使用demo view实现,最后再替换美工的view。这种模式变成了以数据为中心的开发思想。最大的好处是,这种模式中每个部分都可以灵活复用,最大限度的实现现在的各种网络需要,比如互联网和移动互联网。而且,其他的变成语言,在思想方面也基本采用这种模式,这种模式最终被时间证明,成为了标准思考方式和开发方式。微软提倡的桌面化开发,渐渐退却往日之光芒。
3、MVC的内部过程
这个部分是个非常核心的问题,本文除了自己理解,还大量引用了其他相关的文章。尝试讲解清楚MVC的基本运转流程。
MVC的主体过程:
1、 浏览器请求的地址,并不是具体的某个页面,如1234.aspx页面,而是controller/action方法,这是如何做到的?
2、 Controller被访问到以后,如何找到具体的view进行返回的?
我个人的理解就是回答了上述的问题,也就解释清楚了MVC的基本框架。
第一个问题,浏览器请求地址的问题,MVC之所以能够找到具体的Controller是因为有一个route组件,实现了路由处理的功能,将请求转化为Controller的具体方法。需要注意该组件居然是个独立组件。
Routing的作用:
1、 解析URL,识别当中的参数
2、 解析之后,调用具体的controller和action
比如首页地址是: localhost/home/index
我们发现访问上面的地址,
最后会传递给 HomeController中名为index的action(即HomeController类中的index方法).
当然服务器端不会自己去实现这个功能,
关键点就是在Global.asax.cs文件中的下列代码:
public static void RegisterRoutes(RouteCollection routes)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
// Route name
"{controller}/{action}/{id}",
// URL with parameters
new { controller = "Home", action = "Index", id = "" }
// Parameter defaults
protected void Application_Start()
RegisterRoutes(RouteTable.Routes);
回来看我们的Url: localhost/home/index
localhost是域名,
所以首先要去掉域名部分: home/index
对应了上面代码中的这种URL结构:{controller}/{action}/{id}
因为我们建立了这种Url结构的识别规则,
所以能够识别出 Controller是home,action是index,id没有则为默认值"".
上述功能之所以能够实现,关键在MapRoute方法,虽然MapRoute方法是RouteCollection对象的方法,但是却被放置在System.Web.Mvc程序集中,
如果你的程序只引用了System.Web.Routing,
那么RouteCollection对象是不会有MapRoute方法的.
但是如果你同又引用了System.Web.Mvc,
则在mvc的dll中为RouteCollection对象添加了扩展方法:
public static void IgnoreRoute(this RouteCollection routes, string url);
public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
RouteCollection是一个集合,他的每一项应该是一个Route对象.
但是我们使用MapRoute时并没有创建这个对象,
这是因为当我们将MapRoute方法需要的参数传入时,
在方法内部会根据参数创建一个Route对象:
public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) {
if (routes == null) {
throw new ArgumentNullException("routes");
if (url == null) {
throw new ArgumentNullException("url");
Route route = new Route(url, new MvcRouteHandler()) {
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints)
if ((namespaces != null) && (namespaces.Length > 0)) {
route.DataTokens = new RouteValueDictionary();
route.DataTokens["Namespaces"] =
routes.Add(name, route);
上面就是MapRoute方法的实现,
至于在创建Route对象时第二个参数是一个MvcRouteHandler,
它是一个实现了IRouteHandler接口的类. IRouteHandler十分简单只有一个方法:
IHttpHandler GetHttpHandler(RequestContext requestContext);
参数是一个RequestContext
这个类的结构也很简单:
public class RequestContext
public RequestContext(HttpContextBase httpContext, RouteData routeData);
public HttpContextBase HttpContext { }
public RouteData RouteData { }
其中的一个属性RouteData就包含了Routing根据Url识别出来各种参数的值,
其中就有Controller和Action的值.
归根结底, ASP.NET MVC最后还是使用HttpHandler处理请求. ASP.NET MVC定义了自己的实现了IHttpHandler接口的Handler:MvcHandler,
因为MvcRouteHandler的GetHttpHandler方法最后返回的就是MvcHandler.
MvcHandler的构造函数需要传入RequestContext
也就是传入了所有的所有需要的数据,
所以最后可以找到对应的Controller和Action,
已经各种参数.
(引用参考:/zhangziqiu/archive//ASPNET-MVC-2.html)
(引用参考:/zhangziqiu/archive//Aspnet-MVC-3.html)
第二个问题:Controller找到了,Action也找到了,此时如何哪?
下面分层次的总结Controller处理流程:
1. 页面处理流程
发送请求 C> UrlRoutingModule捕获请求 C>MvcRouteHandler.GetHttpHandler() C> MvcHandler.ProcessRequest()
2.MvcHandler.ProcessRequest() 处理流程:
使用工厂方法获取具体的Controller C> Controller.Execute() C>
释放Controller对象
3.Controller.Execute() 处理流程
获取Action C>
调用Action方法获取返回的ActionResult C>
调用ActionResult.ExecuteResult() 方法
4.ActionResult.ExecuteResult() 处理流程
获取IView对象->
根据IView对象中的页面路径获取Page类->
调用IView.RenderView() 方法(内部调用Page.RenderView方法)
通过对MVC源代码的分析,我们了解到Controller对象的职责是传递数据,获取View对象(实现了IView接口的类),通知View对象显示.View对象的作用是显示.虽然显示的方法RenderView()是由Controller调用的,但是Controller仅仅是一个"指挥官"的作用,
具体的显示逻辑仍然在View对象中.需要注意IView接口与具体的ViewPage之间的联系.在Controller和View之间还存在着IView对象.对于ASP.NET程序提供了WebFormView对象实现了IView接口.WebFormView负责根据虚拟目录获取具体的Page类,然后调用Page.RenderView().
引用参考:(/zhangziqiu/archive//Aspnet-MVC-3.html)
讲到这里,相信很多人开始似乎明白了,又似乎不明白了,下面我做进一步的讲解,先看一下,通常Controller的实现如下:
public class HomeController:Controller
public ActionResult Index()
Return View(“Index”);
先看看关键类ActionResult,这个返回值,体现了微软精心设计,为什么做这么个类,其实本质而言,微软希望这个action可以返回更多内容,而不仅仅是view。
ContentResult
根据内容的类型和编码,数据内容.
EmptyResult
FileResult
写入文件内容,具体的写入方式在派生类中.
FileContentResult
FileResult
通过文件byte[]
FilePathResult
FileResult
通过文件路径写入文件.
FileStreamResult
FileResult
通过文件Stream
HttpUnauthorizedResult
抛出401错误
JavaScriptResult
返回javascript文件
JsonResult
返回Json格式的数据
RedirectResult
使用Response.Redirect重定向页面
RedirectToRouteResult
根据Route规则重定向页面
ViewResultBase
调用IView.Render()
PartialViewResult
ViewResultBase
调用父类ViewResultBase
的ExecuteResult方法.
重写了父类的FindView方法.
寻找用户控件.ascx文件
ViewResult
ViewResultBase
调用父类ViewResultBase
的ExecuteResult方法.
重写了父类的FindView方法.
寻找页面.aspx文件
这里我们主要讲解viewResult的作用。
在ASP.NETMVC中,ViewResult用的最多,Controller有一个View方法,它来实例化一个ViewResult对象,并返回。
下面是View方法:
protected internal virtual ViewResult View(string viewName, string masterName, object model) {
if (model != null) {
ViewData.Model =
return new ViewResult {
ViewName = viewName,
MasterName = masterName,
ViewData = ViewData,
TempData = TempData
ViewResult类的ExecuteResult方法的具体参考如下:
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentNullException("context");
if (String.IsNullOrEmpty(ViewName)) {
ViewName = context.RouteData.GetRequiredString("action");
ViewEngineResult result =
if (View == null) {
result = FindView(context);
// 很关键,找到具体的view
View = result.V
ViewContext viewContext = new ViewContext(context, View, ViewData, TempData);
// 很关键,渲染自己
View.Render(viewContext, context.HttpContext.Response.Output);
if (result != null) {
result.ViewEngine.ReleaseView(context, View);
那么如何FindView哪?具体如下:
rotectedoverrideViewEngineResult FindView(ControllerContext context) {
ViewEngineResult result =ViewEngineCollection.FindView(context, ViewName, MasterName);
if (result.View !=
//we need to generate an exception containing all the locations we searched
StringBuilder locationsText =
new StringBuilder();
foreach (string location
in result.SearchedLocations) {
locationsText.AppendLine();
locationsText.Append(location);
new InvalidOperationException(String.Format(CultureInfo.CurrentUICulture,
mon_ViewNotFound,ViewName, locationsText));
从ViewResult类的FindView方法中,得知ViewEngineResult是通过ViewEngineCollection的FindView得到的,而ViewEngineCollection正是ViewEngines的静态属性Engines,Engines返回一个只有一个WebFormViewEngine类型实例的一个集合。所以,ViewEngineResult会是调用WebFormViewEngine类的FindView方法返回的结果。如果ViewEngins的静态属性Engines有多个ViewEngine提供,那么就依次遍历它们直到找到第一个不为空的ViewEngineResult为止。这样我们就可以在同一个MVC网站中使用多种视图引擎了。
静态类ViewEngines的描述如下:
public static class ViewEngines
private static readonly ViewEngineCollection _engines = new ViewEngineCollection { new WebFormViewEngine(), new RazorViewEngine() };
public static ViewEngineCollection Engines
get { return _}
public class ViewEngineCollection : Collection
//其他成员
public virtual ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName);
public virtual ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName);
从上述例子可以看出,起始微软为我们提供了两个ViewEngine, WebFormViewEngine和RazorViewEngine,WebFormViewEngine对应的是ASPX界面,RazorViewEngine对应的是.cshtml/.vbhtml引擎
此外,这里有一个隐藏很深的概念,似乎很多书都没讲清楚,每一个引擎都会对应一个view,作为页面渲染使用,对于viewengine做进一步的解释,就是说,为什么一个view当中的之类的界面元素最后可以变成html,就是这些引擎在起作用,他们的内部实现,可以提供类似正则表达式或者是页面parsing的方法,完成页面字符串解析,从而转换为对应的html,再response给客户端。
微软提供的两种viewengine和view如下:
RazorViewEngine和Razorview
(参考引用:/artech/archive//razor-view-engine-02.html)
WebformViewengine和Webformview
通过上边的讲述,基本的概念已经讲清楚了,如果希望实现自己的viewengine,可以查看一下微软参考实现是如何做到的,然后我们就可以防治自己的viewengine了。这里便需要进一步说明的是,为什么MVC需要viewengine,而WEBFORM不需要,是因为,微软的webform是直接通过IHttphandler处理了,也就是说ASP.NETWEBFORM模式中的HTTPHANDLER完成了事件处理和页面显示的双重功能。而ASP.NETMVC没有事件处理,因此页面显示被划到了viewengine当中实现了。事件处理,被controller替换处理了。
微软的Razorview和Webformview本质上是实现于IView接口,而WebformViewengine和Webformview本质上是实现于IViewEngine
下面介绍他们的实现逻辑:
public interface IView
void Render(ViewContext viewContext, TextWriter writer);
6: public class ViewContext : ControllerContext
//其他成员
public virtual bool ClientValidationEnabled { }
public virtual bool UnobtrusiveJavaScriptEnabled { }
public virtual TempDataDictionary TempData { }
public object
ViewBag { [return: Dynamic] }
public virtual ViewDataDictionary ViewData { }
public virtual IView
public virtual TextWriter
Writer { }
20: public abstract class HttpResponseBase
//其他成员
public virtual TextWriter Output { }
1: public interface IViewEngine
ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);
ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);
void ReleaseView(ControllerContext controllerContext, IView view);
1: public class ViewEngineResult
public ViewEngineResult(IEnumerable searchedLocations);
public ViewEngineResult(IView view, IViewEngine viewEngine);
public IEnumerable SearchedLocations { }
public IView
public IViewEngine
ViewEngine { }
1: public class ViewResult : ViewResultBase
protected override ViewEngineResult FindView(ControllerContext context);
public string MasterName { }
7: public abstract class ViewResultBase : ActionResult
public override void ExecuteResult(ControllerContext context);
protected abstract ViewEngineResult FindView(ControllerContext context);
public object
public TempDataDictionary
TempData { }
public object
ViewBag { [return: Dynamic] }
public ViewDataDictionary
ViewData { }
public string
ViewName { }
public ViewEngineCollection
ViewEngineCollection { }
public IView
(参考引用:/artech/archive//view-engine-01.html)
自定义的View以及相关的Viewengine,参考如下:
public class StaticFileView:IView
public string FileName { }
public StaticFileView(string fileName)
this.FileName = fileN
public void Render(ViewContext viewContext, TextWriter writer)
using (FileStream fs = new FileStream(this.FileName, FileMode.Open))
buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
writer.Write(Encoding.UTF8.GetString(buffer));
internal class ViewEngineResultCacheKey
public string ControllerName { }
public string ViewName { }
public ViewEngineResultCacheKey(string controllerName, string viewName)
this.ControllerName = controllerName ?? string.E
this.ViewName = viewName ?? string.E
public override int GetHashCode()
return this.ControllerName.ToLower().GetHashCode() ^ this.ViewName.ToLower().GetHashCode();
public override bool Equals(object obj)
ViewEngineResultCacheKey key = obj as ViewEngineResultCacheK
if (null == key)
return key.GetHashCode() == this.GetHashCode();
1: public class StaticFileViewEngine : IViewEngine
private Dictionary viewEngineResults = new Dictionary();
private object syncHelper = new object();
public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
return this.FindView(controllerContext, partialViewName, null, useCache);
public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
string controllerName = controllerContext.RouteData.GetRequiredString("controller");
ViewEngineResultCacheKey key = new ViewEngineResultCacheKey(controllerName, viewName);
ViewEngineR
if (!useCache)
result = InternalFindView(controllerContext, viewName, controllerName);
viewEngineResults[key] =
if(viewEngineResults.TryGetValue(key, out result))
lock (syncHelper)
if (viewEngineResults.TryGetValue(key, out result))
result = InternalFindView(controllerContext, viewName, controllerName);
viewEngineResults[key] =
private ViewEngineResult InternalFindView(ControllerContext controllerContext, string viewName, string controllerName)
string[] searchLocations = new string[]
string.Format( "~/views/{0}/{1}.shtml", controllerName, viewName),
string.Format( "~/views/Shared/{0}.shtml", viewName)
string fileName = controllerContext.HttpContext.Request.MapPath(searchLocations[0]);
if (File.Exists(fileName))
return new ViewEngineResult(new StaticFileView(fileName), this);
fileName = string.Format(@"\views\Shared\{0}.shtml", viewName);
if (File.Exists(fileName))
return new ViewEngineResult(new StaticFileView(fileName), this);
return new ViewEngineResult(searchLocations);
public void ReleaseView(ControllerContext controllerContext, IView view)
1: public class MApplication : System.Web.HttpApplication
protected void Application_Start()
//其他操作
ViewEngines.Engines.Insert(0, new StaticFileViewEngine());
1: public class HomeController : Controller
public ActionResult ShowNonExistentView()
return View("NonExistentView");
public ActionResult ShowStaticFileView()
return View();
我们为Action方法ShowStaticFileView创建一个StaticFileView类型的View文件ShowStaticFileView.s(该View文件保存在“~/Views/Home”目录下,扩展名不是.cshtml,而是shtml),其内容就是如下一段完整的HTML。}

我要回帖

更多关于 asp.net知识点总结 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信