ASP.NET MVC 学习笔记 1

时间:2024-08-22 08:05:55

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(三者全部用到)

  ASP.NET MVC  学习笔记 1

  英文解释

  1. Request comes into ASP.NET
  2. ASP.NET Routing finds the route match by calling RouteCollection.GetRouteData
  3. This in turn calls RouteBase.GetRouteData on each route until it finds a match
  4. The IRouteHandler for the matching route has its GetHttpHandler method called
  5. The MvcHandler runs (ProcessRequest is called)
  6. The MVC controller factory locates and creates the controller in CreateController
  7. The ControllerActionInvoker determines which action to run in InvokeAction
  8. The AuthorizationFilter stage executes (this includes the authorization method on the controller itself)
  9. The ActionExecuting stage executes
  10. The requested action method is executed
  11. The ActionExecuted stage executes
  12. If there is a result object then the ResultExecuting stage executes
  13. If the result wasn't cancelled then the ActionResult's ExecuteResult method is executed
  14. The ResultExecuted stage executes
  15. 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 = "", 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