asp.net mvc中“Action”的创建

内容概览

本篇主要探讨“Action”的创建过程,为什么要加引号呢?因为我们创建的不 是真正的Action,方法是没法创建的,它是指 ActionDescriptor对象,是对 Action方法描述的一个对象,在mvc中,方法的调用是利用反射来实现的。下面我 们就具体讨论一下这个过程。

* 为什么要创建Action?

* ControllerDescriptor与ActionDescriptor

* ActionMethodSelector是什么?

* 获取全部合法的Action

为什么要创建Action?Top

在一个请求到达时,必然最终会由一个Action去执行,那么这个Action是怎么 执行的呢?答案是利用反射得到 Action的描述,然后再调用Action的。为什么要 这么大费周折呢?因为在Action上还有好多Filter,我们要在执行的时候考虑到 AOP的影响,并把二者无缝的结合起来。所以在执行Action上,我们要得到一个 ActionDescriptor对象,这个对象用以描述Action方法的一些特性。

ControllerDescriptor与ActionDescriptor

ControllerDescriptor是描述Controller的类,ActionDescriptor是描述 Action的类,而Action是 Controller的方法,那么在ControllerDescriptor和 ActionControllerDescriptor两者之间就必然存在着某种关联,下面我们看看到 底他们是一种什么关系:

在ControllerActionInvoker类中,我们发现了两个类直接的一次协作,代码 是这样的:

ControllerDescriptor controllerDescriptor =  GetControllerDescriptor(controllerContext);
ActionDescriptor actionDescriptor = FindAction(controllerContext,  controllerDescriptor, actionName);
ActionDescriptor actionDescriptor =  controllerDescriptor.FindAction(controllerContext,  actionName);

我们看到,ActionDescriptor是调用ControllerDescriptor的FindAction方法 得到的。我们猜想它们可能是一对多关系,一个ControllerDescriptor对应多个 ActionDescriptor,下面就一步一步来验证我们的猜想,首先我们先从 ReflectedControllerDescriptor类入手,因为这个类是ControllerDescriptor类 的惟一继承者。

ReflectedControllerDescriptor类有几个比较重要的字段:

private ActionDescriptor[] _canonicalActionsCache;
private readonly Type _controllerType;
private readonly ActionMethodSelector _selector;

时间: 2024-12-02 13:21:35

asp.net mvc中“Action”的创建的相关文章

ASP.NET MVC中Area的另一种用法

[摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{action}", new { }, newstring[] { "CNBlogs.UcHome.Web.Controllers.Api" }); 我们在ASP.NET MVC中使用Area时通常这么干: 在Web项目中创建Areas文件夹,在其中创建对应的Area文件夹,在其下创建Controllers文件夹.然后在Area文

ASP.NET MVC中的视图生成简介

在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用. public ActionResult Index() {    return this.View(); } 默认情

ASP.NET MVC中的ActionFilter是如何执行的?

在ASP.NET MVC中的四大筛选器(Filter),ActionFilter直接应用在某个Action方法上,它在目标Action方法执行前后对调用进行拦截以执行一些额外的操作.这是一种典型的AOP式的设计,如果我们需要在执行某个Action方法的前后执行一些操作,可以通过定义ActionFilter来实现.本篇文章主要讲述多一个应用到相同Action方法上的ActionFilter的执行机制. 一.ActionFilter ActionFilter允许我们在目标Action方法执行前后对调

ASP.NET MVC中你必须知道的13个扩展点

ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了ASP.NET MVC中的13个扩展点.Keyvan Nayyeri(与Simone合著了Beginning ASP.NET MVC 1.0一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在 以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助. ASP.NET MVC设计

包含在ASP.NET MVC中的过滤器

在深入研究如何编写过滤器之前,首先看看包含在ASP.NET MVC中的过滤器. ASP.NET MVC包括了如下3种即开即用的动作过滤器: Authorize:该过滤器用于限制对控制器或控制器动作的访问. HandleError:该过滤器用来指定一个处理异常的动作,这个异常是从动作方法的内部抛出的. OutputCache:该过滤器用来为动作方法提供输出的缓存. 接下来将依次深入讨论这3个过滤器. 1  Authorize AuthorizeAttribute是包含在ASP.NET MVC中默认

ASP.NET MVC中的视图生成实例分析_实用技巧

本文实例分析了ASP.NET MVC中的视图生成过程.分享给大家供大家参考.具体如下: 在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通常,在 Controller 中,我们定义多个 Action ,每个 Action 的返回类型一般是 ActionResult,在 Action 处理的最后,我们返回对于视图的调用. 复制代码 代码如下: pub

在ASP.NET MVC中如何使用异步控制器

在ASP.NET MVC中使用异步操作的时候,我有这么几个关注点.异步操作何时提高我应用的性能,什么时候没改善?     在ASP.NET MVC中到处使用异步操作真的好吗?    对于可等待的(awaitable)方法: 当查询数据库时(通过EF/BHibernate/其他的ORM)应该使用async/await关键字吗?    在一个单独的操作方法中,异步地查询数据库可以使用await关键字多少次? 当一个action必须执行多个独立的长期运行的操作时,异步action方法是很有用的. 假设

Asp.Net MVC中配置Serilog的方法_实用技巧

一.Serilog介绍 Serilog 是一种非常简便记录log 的处理方式,使用Serilog可以生成本地的text文件, 也可以通过 Seq 来在Web界面中查看具体的log内容. 二.配置方法 接下来就简单的介绍一下在Asp.Net MVC中如何配置是Serilog 生效:  1):下载并且安装Seq,具体的下载URL 为 [http://getseq.net/Download],安装到默认的路径之后,实际上时候启动了一个Win Service,并且监听的端口号默认为 5341. 安装的最

七天学会ASP.NET MVC(七)——创建单页应用

系列文章 七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)--ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)--ASP.Net MVC 数据处理 七天学会ASP.NET MVC (四)--用户授权认证问题 七天学会ASP.NET MVC (五)--Layout页面使用和用户角色管理 七天学会ASP.NET MVC (六)--线程问题.异常处理.自定义URL 七天学会ASP.NET MVC(七)--创建单页应