自己的学习记录,加上心得体会,加上浅显的看法。
本书包括三大部分,23章,以“体验篇-架构篇-实战篇”为线索讲解。
前言
2009年3月18号,微软开发团队正式发布了ASP.NET MVC 3.5 1.0版本。
体验篇 1-13章
第一章 初识
1.1 概述
1.1.1 基本概念
MVC(Model View Controller)模式是一种结构设计模式,根据功能不同,分为模型、视图以及控制器。
ASP.NET 3.5 MVC 框架基于MVC设计模式。
模型:MVC设计模式中需要显示的数据。通常提供数据的访问方法以及数据的维护。
视图:用来显示模型中数据的用户界面。一般是指HTML页面。
控制器: 处理对用户的输入或者交互命令,以便改变模型的状态,选择适当的视图才呈现对应模型中的数据。
1.1.2 MVC之间的相互关系
当用户在浏览器中输入浏览地址,到获得也面对饿反馈结果,需要经过以下五个过程:
1)用户输入地址,发出页面请求时,实际是向控制器发出相关的命令;
2)控制器得到命令后,向模型请求相关的数据;
3)模型得到数据后,向控制器返回对应的数据;
4)控制器将有关的数据发送到指定的视图;
5)指定的视图呈现被指定的数据;
实际工作中,开发者就是实现控制器的编码;
1.1.3 优点
通过模型、视图、控制器,很好的分离了用户输入逻辑,业务逻辑和界面显示逻辑。易于实施测试驱动开发;组件可以被替换或者个性化;支持Web Forms相关特性;URL被映射到控制器(ASP.NET应用程序中, URL通常被映射为保存在磁盘上的一个文件,.aspx文件)。
1.2 创建MVC项目
1.2.1 创建一个项目
1.2.2 执行过程
1 UrlRoutingModel模块入口
浏览器请求时,URL地址首先被传递到上面设置的UrlRoutingModel模块,该模块解析Url地址,然后选择相关的Url路由,并得到相关的IHttpContext对象来处理该Url路由(默认MvcHandler对象)。实现以下三个功能
◊选择适当的控制器;
◊获得指定控制器的一个实例化对象;
◊调用指定控制器的方法;
请求一个基于MVC框架的网站页面时,包括5个步骤:
创建RoutTable,URL路由,执行MvcHandler,执行Controller和执行Viewsonic()方法。
2 五个执行步骤
在传统的ASP.NET应用程序中,每一个被请求的页面都对应着文件系统中的一个文件,否则会出错。每一个页面都被表示为一个类,该类实现了IHttpHandler接口(页面继承System.Web.UI.Page, 而System.Web.UI.Page继承public class Page : TemplateControl, IHttpHandler),每当一个页面被请求时,就会调用该类中的ProcessRequest()方法;然后将指定的内容返回到浏览器。
ASP.NET 3.5 MVC 框架中,每一个页面都被映射到相应的控制器中的相关方法,控制器负责将指定的内容返回到浏览器。多个多页可以映射到同一个控制器的不同方法。
页面到控制器的映射是通过路径表(Rout Table)而实现的,对于每一个应用程序有一个路径表。路径表通过RoutTable.Routes属性表示。路由对象负责实现URL到处理器的映射,该路由对象实现URL到MvcRouteHandler的映射,将具有{controller}/{Action}/{id}模式的URL映射到MvcRouteHandler。
URL路由类库位于命名空间System.Web.Routing之中,与System.Web.MVC是独立的,因此可以再非MVC框架的网站使用URL路由功能。
在请求一个MVC网站页面时,在web.config中配置的UrlRoutingModule模块解析该URL,并获得相关的RouteData对象,然后创建HttpHandler的实例化对象MvcHandler。
在执行MvcHandler时,调用其中的ProcessRequest()方法,创建一个控制器的实例化对象。
在执行Controller时, 调用其中的Execute()方法,在该方法内部通过反射原理实现对指定其他方法的调用,在调用的方法中会执行View()方法,从而将指定的内容返回到浏览器中。
1.2.4 控制器
控制器处理用户的请求,将用户请求的URL路由,分发到控制器的相关动作方法,而不是文件系统中某个对应的真是文件。这是与传统Web Forms的区别之一。
1 HomeController类
在控制器中定义的方法必须设置为public,如果是一个内部方法则要用过滤器[NonActionAttribute]。
Index()方法返回的类型是ActionResult。 ActionResult是一个抽象类,因此返回的类型是该抽象类的子类:
URL路由
1Def:通过({})定义占位符,这些占位符就是URL路由参数,而字符串中的“/", "."作为分隔符;
{controllder}/{action}/{id} /Productor/show/beveragcs
producetor是控制器的名称, show是该控制器中所定义的一个方法,beveragecs则是一个id变量。
通过静态类RouteTable的属性Routes来设置URL路由。URL的排列顺序十分重要,当URL路由根据URL请求去寻找匹配的URL路由时, 一旦寻找到第一个匹配的URL路由,就不再继续寻找剩下的URL路由了。
2 URL路由参数的默认值
public static void RegisterRoutes(RouteCollection routes) { route.Add(new Route ( "Category/{Action}/{categoryName}", new CategoryRouteHandler() ){ Defaults = new RouteValueDictionary {{"categoryName", "food"}, {"Action", "show"}} } ); }
categoryName 的变量值是food, 而Action方法则是对应控制其中的show()方法。
3 路由通配符
4 路由参数约束
1 pubic static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.Add(new Route 4 ("{local)/{year}", new ReportRouteHandler() 5 ) 6 { 7 Constraints = new RouteValueDictionary 8 { {"local", "{a-z}{2}-{a-z}{2}, {year", @"\d{4}"}} 9 }); 10 }
添加了对URL路由参数locale及year的约束, locale必须是英文字母,前面的2位英文字读必须是小写的,后面的两个英文字母必须是大写的,而year必须是4位数字。
1.3.2 使用URL路由
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二章 路由进阶
更新中……