ActionInvoker

还是这张图:

当ControllerFactory生成Controller实例后,这时就需要使用ActionInvoker来选择调用一个合适的Action执行。ASP.NET MVC提供的基类Controller已经实现了ActionInvoker的功能。但是我们可以实现自定义的ActionInvoker来替代框架中提供的ActionInvoker。

首先一个ActionInvoker需要实现IActionInvoker接口:

public interface IActionInvoker
{
bool InvokeAction(ControllerContext controllerContext, string actionName) ;
}

InvokeAction参数有两个,其中controllerContext包含当前Controller信息和请求信息,而actionName则是用调用的action名。当函数找到一个合适的Action并成功调用时返回true,否则返回false。

那我们要怎样才能使用自定义的ActionInvoker呢,Controller类给我们提供了ActionInvoker属性,所以我们可以通过设置该属性让MVC使用我们的ActionInvoker:

    public class HomeController : Controller
{
public HomeController()
{
this.ActionInvoker = new MyActionInvoker();
} //....其他代码.....
}

MVC中内置的ActionInvoker

 上面也说了,基类Controller实现了ActionInvoker的功能,它使用的就是MVC内置的ActionInvoker-----ControllerActionInvoker。

一个方法要被ControllerActionInvoker当作一个Action需要满足以下条件:

  1.该方法的作用域必须为public

  2.该方法不能是静态方法

  3.该方法不能是Controller基类的方法

  4.该方法不能是构造函数

另外:如果方法是一个泛型方法,比且符合以上条件,则会在尝试调用的时候抛出一个异常

默认的,ControllerActionInvoker会将与actionName相同的方法名的方法作为Action,并调用。但是如果一个Controller中有多个同名的重载的方法时怎么办呢,我们可以使用ActionNameAttribute特性来设置Action别名:

    public class HomeController : Controller
{
[ActionName("Enumerate")]
public ActionResult List()
{
return View();
}
}

这样当我们请求/home/enumerate 时,调用的Action就是List,但当我们请求/home/list时,List将不会被调用,在这个例子中将返回404页面。

除了别名,ControllerActionInvoker还使用了action method selection(选择偏好)机制来处理如何选择多个同名的方法,来看下面的代码:

        [HttpGet]
public ViewResult MyAction(int? id)
{
return View(id);
} [HttpPost]
public ViewResult MyAction(Product product)
{
return View(product);
}

这个大家应该都很清楚了,当get请求时调用的是MyAction(int? id),而post请求时调用的是MyAction(Product product)。这就是action method selection。

我们可以创建自定义的Action Method选择器,来设定ControllerActionInvoker的选择偏好。

    public class ActionMethodSelectorAttribute : Attribute
{
public bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
return controllerContext.HttpContext.Request.IsLocal;
}
}

选择器需要有IsValidForRequest方法,当方法返回true时,表示符合偏好,会优先调用该方法。

ControllerActionInvoker未找到合适Action时的处理:

在这种情况下将会调用Controller的HandleUnknowAction方法,这个方法将会显示404页面,但是我们可以重写该方法以改变默认行为:

        protected override void HandleUnknownAction(string actionName)
{
Response.Write(string.Format("未发现你要找的Action: {0}", actionName));
}
 
 

ActionInvoker的更多相关文章

  1. ASP.NET MVC学习笔记-----ActionInvoker

    还是这张图: 当ControllerFactory生成Controller实例后,这时就需要使用ActionInvoker来选择调用一个合适的Action执行.ASP.NET MVC提供的基类Cont ...

  2. MVC扩展ActionInvoker,自定义ActionInvoker,根据请求数据返回不同视图

    ActionInvoker的作用是:根据请求数据(HttpPost,HttpGet等)和action名称,来激发响应的action,再由action渲染视图.本文通过自定义ActionInvoker, ...

  3. C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)

    本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...

  4. ASP.NET MVC原理

    仅此一文让你明白ASP.NET MVC原理   ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与 ...

  5. Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护

    CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...

  6. asp.net MVC 应用程序的生命周期

    下面这篇文章总结了 asp.net MVC 框架程序的生命周期.觉得写得不错,故转载一下. 转载自:http://www.cnblogs.com/yplong/p/5582576.html       ...

  7. 仅此一文让你明白ASP.NET MVC原理

    ASP.NET MVC由以下两个核心组成部分构成: 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称: 一个名为MvcHandler ...

  8. 9.1.3 .net framework通过业务逻辑层自动生成WebApi的做法

    首先需要说明的是这是.net framework的一个组件,而不是针对.net core的.目前工作比较忙,因此.net core的转换正在编写过程中,有了实现会第一时间贴出来. 接下来进入正题.对于 ...

  9. asp.net mvc 之旅 —— 第五站 从源码中分析asp.net mvc 中的TempData

    在mvc的controller中,我们知道有很多的临时变量存放数据,比如说viewData,viewBag,还有一个比较特殊的tempData,关于前两个或许大家都明白, 基本上是一个东西,就是各自的 ...

随机推荐

  1. php exit、return、break、continue之间的差别,具体介绍

    相信大家在php开发中有几个经常使用的停止程序和循环的keyword的误区( exit.return.break.continue) exit 退出全部脚本,是个函数 return 语言结构的使用方法 ...

  2. windows下利用OpenVPN搭建VPNserver

    一.OpenVPN是一款功能强大,可跨平台(支持Win 2000/XP/2003, Linux, Mac OS X, Solaris, FreeBSD, NetBSD, 和 OpenBSD)使用的SS ...

  3. Xcode下执行HelloWorld

    准备工作 到Cocos2d-x官方站点下载最新版本号v3.0beta2 创建HelloWorld项目 将刚才下载的压缩包解压到你指定的目录里. 进入到文件夹**cocos2d-x-3.0beta2/t ...

  4. 一个大浪Java罢工(一个)安装JDK和环境变量配置

    一个.基础知识 (一)什么是Java? Java是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台( ...

  5. Android分析应用程序的构建过程

    为了方便Android应用开发要求我们Androidproject编制和包装有了更深入的了解,例如,我们知道这是做什么的每一步,境和工具.输入和输出是什么.等等. 在前文<命令行下Android ...

  6. MySQL安装指南

    近期领导突然说要用MySQL,我立刻当天晚上就研究了一下. http://www.mysql.com/这是官网,还好能够訪问.好多年前已经被oracle收购.分为企业版和社区版: MySQL Ente ...

  7. changePage() 页面跳转

    jQuery.mobile.changePage( to [, options ] ) 从一个页面跳转到另一个页面,使用$.mobile对象的changePage方法来实现.但要使用此方式的时候,要以 ...

  8. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  9. Nginx均衡负载(IP_HASH)未生效

    由于公司业务的发展,单台服务器已经无法满足并发和用户的需求,所以只能通过水平拓展的方式加机器来解决,线上采用的是Nginx+Tomcat集群的方式来解决.由于当前业务量不是很大,而且由于之前代码的问题 ...

  10. leetcode[70] Simplify Path

    题目的意思是简化一个unix系统的路径.例如: path = "/home/", => "/home"path = "/a/./b/../../ ...