ASP.NET MVC 描述类型(二)

前言

上个篇幅中说到ControllerDescriptor类型的由来过程,对于ControllerDescriptor类型来言ActionDescriptor类型的生成则简单的多了,本章的主题有两个,第一是说明ActionDescriptor类型的生成过程,第二是描述ActionDescriptor类型的重要性,在哪里体现它的重要性呢?对于前面篇幅的学习忽略了最后控制器方法的执行过程,而在这个执行过程中ActionDescriptor类型起到了至关重要的作用,来看下文吧。

ActionDescriptor类型的生成

这里我又要采用老手段了(“盗”图),从前面的篇幅中拉过来示意图,快速的说明ActionDescriptor类型的生成过程。

图1

在ReflectedControllerDescriptor类型生成后,流程会回到MVC框架中,并且由之调用ControllerActionInvoker类型下的FindAction()方法,在FindAction()【是ControllerActionInvoker类型中的方法】的参数中,第一个参数类型是控制器上下文类型,第二个则是我们在上篇中讲解生成的ReflectedControllerDescriptor类型【ControllerDescriptor类型】,第三个则是控制器方法的名称,第一个参数的暂且不管,在FindAction()方法中是会使用第二个ReflectedControllerDescriptor类型的参数中的FindAction()方法【图中所示的FindAction()方法】,并且参数是引用上层的FindAction()方法传递下来的,然后通过ReflectedControllerDescriptor类型中的ActionMethodSelector类型变量生成一个MethodInfo类型的变量,用于实例化ReflectedActionDescriptor类型。

我们看下ReflectedActionDescriptor类型的定义,示例代码1-1

代码1-1

public class ReflectedActionDescriptor : ActionDescriptor
{
public ReflectedActionDescriptor(MethodInfo methodInfo, string actionName, ControllerDescriptor controllerDescriptor);
public override string ActionName { get; }
public override ControllerDescriptor ControllerDescriptor { get; }
//
// 摘要:
// 获取或设置操作-方法信息。
//
// 返回结果:
// 操作-方法信息。
public MethodInfo MethodInfo { get; }
public override string UniqueId { get; } // 摘要:
// 使用指定的操作-方法参数来执行指定的控制器上下文。
//
// 参数:
// controllerContext:
// 控制器上下文。
//
// parameters:
// 参数。
//
// 返回结果:
// 操作返回值。
//
// 异常:
// System.ArgumentNullException:
// parameters 或 controllerContext 参数为 null。
public override object Execute(ControllerContext controllerContext, IDictionary<string, object> parameters);
public override object[] GetCustomAttributes(bool inherit);
public override object[] GetCustomAttributes(Type attributeType, bool inherit);
public override ParameterDescriptor[] GetParameters();
public override ICollection<ActionSelector> GetSelectors();
public override bool IsDefined(Type attributeType, bool inherit);
}

在代码1-1中,我保留了两个注释一个是MethodInfo属性的,还有一个就是Execute()方法的,因为这一个属性一个方法在下面重要性小节中会有叙述到。

ActionDescriptor类型的重要性

想必看过前面篇幅的朋友都知道,在ASP.NET MVC 过滤器(三)篇幅中我们讲解到了行为过滤器的在MVC框架中的具体生成执行过程,然后在那个篇幅中因为主题不符的原因,我们忽略了Action的执行,看下示意图2

图2

对于这幅示意图有什么不明白的朋友可以去看博主所写的ASP.NET MVC 过滤器(三)篇幅,而对于本篇而言为了说明ActionDescriptor类型的重要性就需要讲到Action的执行过程,上面的图我们只需要关注图3的部分。

图3

对于Action执行过程的入口是在ControllerActionInvoker类型的InvokeActionMethod()方法之中,看到图3中的方法参数就明白了ActionDescriptor类型的重要性了。它是必须的,来看下图4.

图4

ActionDescriptor类型是抽象的,在上个小节中也有看到定义,MVC框架默认生成就是ReflectedActionDescriptor类型,在图4中可以看到,MVC框架一开始就会调用ActionDescriptor类型的Execute()方法,只不过这里是由实现类型ReflectedActionDescriptor类型替代了,然后会接着调用ActionDescriptor类型中的ActionMethodDispatcherCache类型的的变量的GetDispatcher()方法,然后会由ActionMethodDispatcher类型中定义的为GetExecutor()方法,这个方法内部实现就是拆解的MethodInfo信息,并且返回的是ActionExecutor委托类型,最终由ActionMethodDispatcher类型的Execute()方法【实际执行的是ActionExecutor委托】执行最后的Action,并且返回一个值,然后通过ControllerActionInvoker类型中的CreateActionResult()引用刚刚Action执行后的值生成ActionResult类型的实例,最后在InvokeActionResult()方法的实现中,MVC框架会调用ActionResult类型的实例ExecuteResult()方法来通往View引擎。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 描述类型(二)的更多相关文章

  1. ASP.NET MVC 描述类型(一)

    ASP.NET MVC 描述类型(一) 前言 在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下 ...

  2. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

  3. ASP.NET MVC Model绑定(二)

    ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...

  4. ASP.NET MVC Model元数据(二)

    ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...

  5. ASP.NET MVC 控制器激活(二)

    ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...

  6. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  7. 表现层及ASP.NET MVC介绍(二)

    表现层及ASP.NET MVC介绍(二) 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间.不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新.本文继续介绍表现层和 ...

  8. Asp.Net Mvc 返回类型总结

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. ASP.NET MVC 枚举类型转LIST CONTROL控件

    在实际应用中,我们经常会用到下拉框.多选.单选等类似的控件,我们可以统称他们为List Control,他们可以说都是一种类型的控件,相同之处都是由一个或一组键值对的形式的数据进行绑定渲染而成的. 这 ...

随机推荐

  1. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  2. [APUE]文件和目录(上)

    一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...

  3. 阿里云学生优惠Windows Server 2012 R2安装IIS,ftp等组件,绑定服务器域名,域名解析到服务器,域名备案,以及安装期间错误的解决方案

     前言: 这几天终于还是按耐不住买了一个月阿里云的学生优惠.只要是学生,在学信网上注册过,并且支付宝实名认证,就可以用9块9的价格买阿里云的云服务ECS.确实是相当的优惠. 我买的是Windows S ...

  4. php注册审核

    通过注册审核,判断刚创建的账户是否可以使用. 后台管理员审核通过后,账号可以使用. 通过session 设置只能通过登录入口进入网页. 原理:通过数据库设置账号的一个字段状态,例: isok:1, i ...

  5. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

  6. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...

  7. 去IOE的一点反对意见以及其他

    某天在机场听见两老板在聊天,说到他们目前销售的报表老跟不上的问题,说要请一个人,专门合并和分析一些发过来的excel表格,我真想冲上去说,老板,你需要的是一个信息处理的系统,你需要咨询么.回来一直耿耿 ...

  8. 一个软件开发者的BPM之路

    我是小林,一名普通的软件工程师,从事BPM(业务流程管理)软件开发工作.我没有几十年的技术底蕴,无法像大牛们一样高谈阔论,品评BPM开发之道:也不是资深的流程管理专家,能与大家分析流程管理的时弊.我只 ...

  9. 免费公开课,讲解强大的文档集成组件Aspose,现在可报名

    课程①:Aspose.Total公开课内容:讲解全能型文档管理工具Aspose.Total主要功能及应用领域时间:2016-11-24 14:30 (暂定)报名地址:http://training.e ...

  10. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...