zoukankan      html  css  js  c++  java
  • MVC从路由到Controller运行机制

    下图中每个箭头的左侧对应的右侧方法为对象调用方法的过程:

           由于UrlRoutingModule这个HttpModule被注册到Web应用中,所有对每个抵达的请求来说,当代表当前应用的HttpApplication对象的PostResolveRequestCache事件被触发的时候,UrlRoutingModule会利用RouteTable表示的路由表(实际上RouteTable的静态属性Routes返回的RouteCollection对象代表这个路由表)针对当前请求实施路由解析。

           具体来说,UrlRoutingModule会调用路由表的RouteCollection对象的GetRouteData方法,如果定义在某个Route对象上的路由规则与当前请求相匹配,那么该方法执行结束自后会返回一个包含目标Controller和Action名称的路由变量的RouteData对象。

           接下来UrlRoutingModule通过RouteData对象那个的RouteHandler属性得到匹配Route对象采用的RouteHandler对象,默认情况下这是一个MvcRouteHandler对象。UrlRoutingModule就调用这个MvcRouteHandler对象的GetHttpHandler方法得到一个MvcHandler对象。UrlRoutingModule随之调用当前HttpContext的RemapHandler方法对得到的HttpHandler(MvcHandler)对象实施映射,那么此HttpHandler将最终接管当前请求的处理。

    对于MvcHandler来说,当它被用来处理当前请求的时候,它会利用RouteData对象得到目标Controller的名称,并借助于主场的ControllerFactory来激活对应的Controller对象。目标Controller被激活之后,它的Execute方法被MvcHandler调用。

           如果被激活的Controller对象的类型是ControllerBase的子类,当它的Execute方法被执行的时候,它会调用ActionInvoker对象的InvokeAction方法来执行目标Action方法并对当前请求予以响应。默认采用的ActionInvoker是一个ControllerActionInvoker对象,当它的InvokeAction方法被执行的时候,它会利用注册的ModelBinder采用Model绑定的方式生成目标Action方法的参数列表,并利用ActionExecutor对象以“表达式树”的方式执行目标Action方法。

           目标Action方法执行之后总是会返回一个ActionResult(对于返回类型不是ActionResult的Action方法来说,ASP.NET MVC总是会将执行的结果转换成一个ActionResult对象),ControllerActionInvoker会通过执行此ActionResult对象来对请求作最终的响应。

  • 相关阅读:
    HTML5 CANVAS制图 基础总结
    CSS3(transform/transition/animation) 基础 总结
    创建一个js日历(原生JS实现日历)
    别光知道用console.log调试了,快来试试这些高效的调试方法!
    file_get_contents无法获取到https链接内容问题
    element-ui 的 table 组件 row-style不生效 无法设置行高的问题
    Element-ui 解决table设置fixed属性后 el-image组件放大图片样式被覆盖问题
    js实现简单sku变体组合算法
    关于cnpm命令没有反应(并不报错)的处理办法
    2019-8-14
  • 原文地址:https://www.cnblogs.com/Vam8023/p/8453088.html
Copyright © 2011-2022 走看看