MVC 的由来:
在 MVC 模式之前,View 界面的呈现、用户交互操作的捕捉与相应、业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图。
这重设计模式主要存在三大弊端:
因此,为了解决这些问题,有人采用了关注点分离的原则,将视图界面、业务逻辑、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 名称。
来源: http://www.cnblogs.com/sundar/p/5840818.html