1. 什么是ASP.Net MVC
ASP.Net MVC是一种开发Web应用程序的工具(is a web application development framework),采用Model-View-Controller即模型-视图-控制器的模式来构建 Web应用程序,强调分层即各部分的分工,每个部分有各自的职责,而不相互替代。
2. ASP.Net MVC来源
很久之前,人们有开发基于Winodw的Web应用程序的需求,于是微软开发出了下列的几个产品:ASP、ASP.NET Web Forms、ASP.NET MVC
ASP即Active Server Page是一种脚本语言,它的代码Code与网页标记Markup放在了一个文件中,这样带来了代码复用率的问题、代码与标记没有分离不能更好的分工,即只是注重代码或只是注重标记,也不能很好的利用面向对象编程。
ASP.NET Web Forms即ASP.NET 窗体应用程序,它采用了Code-Behind的形式,前端是Html标记后台是服务器端代码,解决了ASP中的问题。ASP.NET 窗体应用程序现在在被广大的.NET开发人员所使用,然而仍然有不足,在开发ASP.NET 窗体应用程序时,大量使用到了HTML、JavaScript、CSS,由于这个问题,导致我们不能集中精力的去解决业务逻辑问题。
ASP.NET MVC就此产生,它采用Model-View-Controller即模型-视图-控制器的模式来构建Web应用程序,将应用程序分为了三个层次:Model层、View层、Controller层。各自有自己的职责,实现了分工。
3. 运行机制
请求过程:Request -->Routing --> Handler -->Controller --> Action --> View --> Response (如下图)
发送请求-->路由选择(Routing)-->控制器-->视图,其中控制器是从模型中得到数据的。
示例:HelloWorldBareBone(只是Controller不用View与Model)
示例:HelloWorldBareBone2(Controller+View,没用Model)
示例:HelloWorldBareBoneUsingModel(三者全部用到)
英文解释
- Request comes into ASP.NET
- ASP.NET Routing finds the route match by calling RouteCollection.GetRouteData
- This in turn calls RouteBase.GetRouteData on each route until it finds a match
- The IRouteHandler for the matching route has its GetHttpHandler method called
- The MvcHandler runs (ProcessRequest is called)
- The MVC controller factory locates and creates the controller in CreateController
- The ControllerActionInvoker determines which action to run in InvokeAction
- The AuthorizationFilter stage executes (this includes the authorization method on the controller itself)
- The ActionExecuting stage executes
- The requested action method is executed
- The ActionExecuted stage executes
- If there is a result object then the ResultExecuting stage executes
- If the result wasn't cancelled then the ActionResult's ExecuteResult method is executed
- The ResultExecuted stage executes
- If an error occured then the Exception stage executes
4. 路由Route
客户端发出请求,首先路由要对URL地址进行解析,路由就是一个URL匹配系统,路由里面定义了URL的请求形式,如果URL地址符合这个形式,就会进行下一步处理,如果没有匹配的形式就会报错。在路由中可以定义多个匹配形式。
路由中URL形式的注册是通过RegisterRoutes方法(如下)实现的,在MVC 3中这个方法在Global.asax文件中。在MVC 4中,这个方法在App_Start文件夹下的RouteConfig.cs文件中。这个RegisterRoutes方法会在Application_Start()方法中被调用,也就是说程序刚运行的时候,就会注册。
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // 路由名称 "{controller}/{action}/{id}", // 带有参数的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 ); }
程序中会有一个默认的路由,Default是路由的名称,{controller}/{action}/{id}是这个路由可以匹配的URL格式,如果你输入的是 Home/Index/23,那么程序就会执行Home控制器中的Index方法,并且id=23,如果你输入的是User/Edit/23,那么程序就会执行User控制器中的Edit方法,并且id=23 ,当然,并不是每个都要赋值,这时候也就用到了默认值,上面定义的默认值是,默认是Home控制器,执行的是它的Index方法。
4. Model-View-Controller 模式
这种模式将应用程序分为了三个层次:Model层、View层、Controller层。实现了职责的分工,各自只需负责自己的工作,不需相互关心。即我们常说的“低藕合”。由于各个层次独立了开来,所以可以进行单独的开发与维护,还有利于测试。
Model(模型)
它包含着业务逻辑与数据构成,代表着实体,封装着实体的属性与方法。
View(视图)
视图负责将模型中的数据展示出来,一般是以网页的形式来展示,然而还有更多的形式,比如:PDF、XML、电子表格。视图只是用来展示数据,不包含任何的业务逻辑。
Controller(控制器)
是Model与View的桥梁,负责将Model中的数据传递给View。它控制程序的处理逻辑。客户端的请求经路由解析之后,如果匹配成功,就会调用Controller控制器中的方法。
以HelloWorldBareBoneUsingModel为例:如果用户输入的URL是Home/Index,且匹配默认的路由,那么之后就会调用HomeController中的Index方法(如下)。
public ActionResult Index() { Country oCuntry = new Country { CountryCode = "91", CountryName = "India" }; return View(oCuntry); }
控制器方法要求返回一个ActionResult,上面返回了一个 View(oCuntry),这个是ViewResult类型的,ViewResult是ViewResultBase的子类,而ViewResultBase是ActionResult的子类。父类对象引用子类实例,这是可以的。同理,它还可以返回ContentResult、FileResult、HttpNotFoundResult、JavaScriptResult、JsonResult、PartialViewResult、RedirectResult,加上ViewResult,此外,还可以进行重定向。下面说一下,返回这些类型使用的方法。
返回类型 | ViewResult | ContentResult | FileResult | HttpNotFoundResult | JavaScriptResult | JsonResult | PartialViewResult | RedirectResult | 重定向到一个方法 | 重定向到一个路由 |
使用方法 | View() | Content() | File() | HttpNotFound() | JavaScript() | Json() | PartivalView() | Redirect() | RedirectToAction() | RedirectToRoute() |
示例:ActionResultDemo