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 parameters); public override object[] getcustomattributes(bool inherit); public override object[] getcustomattributes(type attributetype, bool inherit); public override parameterdescriptor[] getparameters(); public override icollection 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喎?https: www.2cto.com/kf/ware/vc/"="" target="_blank" class="keylink">vcd4kpha+pgltzybzcmm9"https://www.2cto.com/uploadfile/collfiles/20140718/20140718094935233.png" alt="\" width="779" height="326">
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引擎。
作者:金源
出处:https://blog.csdn.net/jinyuan0829
本文版权归作者和csdn共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面
喎?https:>下一篇: 初始ASP.NET---一般处理程序
推荐阅读
-
你所不知道的ASP.NET Core MVC/WebApi基础系列 (二)
-
解决ASP.NET MVC返回的JsonResult 中 日期类型数据格式问题,和返回的属性名称转为“驼峰命名法”和循环引用问题
-
ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework
-
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
-
ASP.Net MVC OA项目笔记<二>
-
HandlerMethodArgumentResolver(二):Map参数类型和固定参数类型【享学Spring MVC】
-
asp.net mvc 简单项目框架的搭建(二)—— Spring.Net在Mvc中的简单应用
-
ASP.Net Core MVC 发生二次请求
-
ASP.Net Core 2.2 MVC入门到基本使用系列 (二)
-
ASP.NET MVC中Action返回值类型