MVC的由来:
  在MVC模式之前,View界面的呈现、用户交互操作的捕捉与相应、业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图。
  这重设计模式主要存在三大弊端:
  重用性:业务逻辑与UI是不相关的,如果将业务逻辑与UI绑定在一起,业务逻辑将无法被重用。
  稳定性:业务逻辑、UI逻辑、视图界面三者的稳定性不同,绑定在一起会由差的部分影响到整体,即“短板理论”。(像一个坏木桶里的水,会从缺口的低处先流出来)
  可测试性:当UI与逻辑部分绑定在一起,极大的增加了测试难度。
  因此,为了解决这些问题,有人采用了关注点分离的原则,将视图界面、业务逻辑、UI逻辑三者分离开,并采用合理的交互模式将他们之间的依赖度降到了低。这种模式是MVC。
  什么是MVC模式:
  MVC分别代表着Model、View、Controller,从人机交互的角度来说,View会捕获到用户的操作直接发给Controller,Controller会主动去完成相应的UI逻辑,但如果设计到了业务功能,
  Controller还会调用Model来合作完成。在完成相应的UI逻辑后,Controller根据需要控制原View或者创建新的View对用户操作予以响应。
  什么是ASP.NET MVC:
  一句话概括:ASP.NET MVC是建立在ASP.NET平台上,基于MVC模式的,Web应用框架。
  详细点说:ASP.NET平台采用管道式设计,具有良好的扩展性。整个ASP.NET MVC框架是通过自定义ASP.NET的HttpModule和HttpHandler这两个核心组件而建立的。
  注:MVC中的Model主要体现为维持应用状态并提供业务功能,但ASP.NET MVC中的Model与之是不同的,后者仅仅是绑定到View上的数据而已,两者并不是一回事,在学习理解过程中要格外注意,不要混淆。
  ASP.NET MVC是如何运行的:
  当一个用户请求提交上来后,ASP.NET MVC会针对当前请求实施路由解析,解析的目标是找到用户需要的Controller并激活它,执行对应的Action方法,终返回用户需要的东西。
  也是说,当ASP.NET MVC接收到抵达的请求后,首要任务是通过该请求解析得到对应的Controller和Action名称,那么它是如何解析的呢?这要了解一下Asp.Net MVC的路由系统了。
  ASP.NET MVC路由系统:
  路由是干什么的?
  对于ASP.NET MVC应用来说,来自浏览器的请求总是指向定义在某个Controller类型中的某个Action方法,请求URL与目标Controller/Action之间的映射需要路由来实现。
  路由是如何工作的?
  在ASp.NET MVC的App_Start文件夹的RouteConfig 中有如下一个静态函数
  public static void RegisterRoutes(RouteCollection routes) {
  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
  routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  );
  }
  这是一个路由注册的过程,路由注册的核心在于根据提供的路由规则(路由模板、约束、默认值等)创建一个Route对象,并将其添加到全局路由表中。
  什么是全局路由表?它是做什么的?
  全局路由表是由ASP.NET定义的,路由表中的每个Route对象包含一个路由模板,Controller和Action的名字以占位符的形式,即{controller}{action}的形式定义在模板中,对于
  每一个抵达的HTTP请求,路由系统会遍历路由表并找到一个具有与当前请求URL模式相匹配的Route对象,然后利用它解析出以Controller和Action名称为核心的路由数据。
  MapRoute()方法是做什么的?
  这个方法的意义在于向路由系统中添加自定义的一个URL映射规则。怎么添加的呢?这是根据系统上下文中的RouteTable对象中的RouteCollection类型的属性Routes,而在MapRoute()方法中的实现说白了是根据参数生成Route对象,并且添加Route对象到服务器中。
  简单来说,这段代码实现的功能是按{controller}/{action}/{id}这种格式解析URL地址,得到对应的Controller和Action。如果没有,则跳转默认地址,即/Home/Index。
  通过路由系统得到了需要的Controller和Action名称后,接下来要做的是激活Controller对象,执行Action方法了。
  controller的激活:
  Controller对象的激活是通过工厂模式实现的,在激活Controller的工厂中有一个IControllerFactory接口,该接口具有方法CreateController,根据当前请求的上下文和通过路由解析得到的Controller名称来激活相应的Controller对象。代码如下:
  Public interface IControllerFactory
  {
  IController CreateController(RequestContext requestContext,
  string controllerName);
  }
  Action的执行:
  Action的执行主要是通过Controller的基类ControllerBase中的Execute方法来执行的,如果目标Action方法返回类型为ActionResult,则还需要执行该ActionResult对象对当前请求予以响应。
  在ASP.NET MVC框架中,两种情况的执行都是通过ActionInvoke对象来完成的。
  public interface IActionInvoker
  {
  void InvokeAction(ControllerContext controllerContext,string actionName);
  }
  ActionInvoke对象中定义了一个接口IActionInvoker,该接口定义了的方法InvokeAction,该方法第一个参数为当前Controller的上下文对象,第二个参数为需要激活的Action名称。