ASP.NET MVC 描述类型(二)
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 描述类型(二)的更多相关文章
- ASP.NET MVC 描述类型(一)
ASP.NET MVC 描述类型(一) 前言 在前面的好多篇幅中都有提到过ControllerDescriptor类型,并且在ASP.NET MVC 过滤器(一)篇幅中简单的描述过,今天我们就来讲一下 ...
- ASP.NET MVC Model验证(二)
ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...
- ASP.NET MVC Model绑定(二)
ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...
- ASP.NET MVC Model元数据(二)
ASP.NET MVC Model元数据(二) 前言 在上篇中,给大家留个对Model元数据的印象,并没有对Model元数据有过多的讲解,而在本篇中也不会对Model元数据的本身来解释,而是针对于它的 ...
- ASP.NET MVC 控制器激活(二)
ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉 ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- 表现层及ASP.NET MVC介绍(二)
表现层及ASP.NET MVC介绍(二) 最近的更新速度越来越慢,主要是项目上比较忙,封装EasyUi也要花很多时间.不过大家请放心,本系列不会半途夭折,并且代码干货也会持续更新.本文继续介绍表现层和 ...
- Asp.Net Mvc 返回类型总结
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- ASP.NET MVC 枚举类型转LIST CONTROL控件
在实际应用中,我们经常会用到下拉框.多选.单选等类似的控件,我们可以统称他们为List Control,他们可以说都是一种类型的控件,相同之处都是由一个或一组键值对的形式的数据进行绑定渲染而成的. 这 ...
随机推荐
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- Git与Repo入门
版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...
- 关于微软HttpClient使用,避免踩坑
最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个 ...
- 【Win 10 应用开发】在App所在的进程中执行后台任务
在以往版本中,后台任务都是以独立的专用进程来运行,因此,定义后台任务代码的类型都要位于 Windows 运行时组件项目中. 不过,在14393中,SDK 作了相应的扩展,不仅支持以前的独立进程中运行后 ...
- Android混合开发之WebViewJavascriptBridge实现JS与java安全交互
前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- C#泛型详解(转)
初步理解泛型: http://www.cnblogs.com/wilber2013/p/4291435.html 泛型中的类型约束和类型推断 http://www.cnblogs.com/wilber ...
- BPM任务管理解决方案分享
一.方案概述任务是企业管理者很多意志的直接体现,对于非常规性事务较多的企业,经常存在各类公司下达的各种任务跟进难.监控难等问题,任务不是完成效果不理解,就是时间超期,甚至很多公司管理层下达的任务都不了 ...
- Centos6.5 配置Nginx开机自启动
1.在/etc/init.d/目录下创建 nginx 文件,内容如下: #!/bin/sh # # nginx - this script starts and stops the nginx dae ...