ASP.NET.3.5.MVC架构与实战 学习

自己的学习记录,加上心得体会,加上浅显的看法。

本书包括三大部分,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路由参数的默认值

View Code
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 路由参数约束

View Code
 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路由

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第二章 路由进阶

   

更新中……

原文地址:https://www.cnblogs.com/crazylight/p/2489231.html