ASP.NET MVC学习笔记-----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));
}
ASP.NET MVC学习笔记-----ActionInvoker的更多相关文章
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
- ASP.NET MVC学习笔记-----Filter(2)
接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...
- ASP.NET MVC 学习笔记(1)
从头开始系统地学习ASP.NET MVC 为什么要学习ASP.NET MVC?原因很多,可以先来看一下最早的ASP.NET WebForm的一些缺点: 传说中面试经常要问到的ASP.NET WebFo ...
- 【转】ASP.NET MVC学习笔记-Controller的ActionResult
1. 返回ViewResult public ActionResult Index() { ViewData["Message"] = "Welcome ...
- ASP.NET MVC学习笔记-----使用自定义的View Engine
我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...
- ASP.NET MVC 学习笔记 1
1. 什么是ASP.Net MVC ASP.Net MVC是一种开发Web应用程序的工具(is a web application development framework),采用Model-Vie ...
随机推荐
- LeetCode:Gray Code(格雷码)
题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...
- 20135202闫佳歆--week 9 期中总结
期中总结 前半学期的主要学习内容是学习mooc课程<Linux内核分析>以及课本<Linux内核设计与实现>. 所涉及知识点总结如下: 1. Linux内核启动的过程--以Me ...
- 7.HBase In Action 第一章-HBase简介(1.2.1 典型的网络搜索问题:Bigtable的起原)
Search is the act of locating information you care about: for example, searching for pages in a text ...
- 扫描函数sweep
groot.sweep(element,vm); element 为要扫描的代码片段,vm 对应的一个 groot.view 定义的 一个Vm的整体 扫面代码 groot.sweep = functi ...
- jdbc基础 (四) 批处理
批处理,就是字面上的意思,一次性处理一批sql语句. 直接看例子吧: package com.cream.ice.jdbc; import java.sql.Connection; import ja ...
- VS2008+GDI实现多幅图像的GIF动画制作
相信很多朋友和我一样,经常由于这或那的原因,需制作一些特定格式的图像.如开发过程中需要给菜单.工具条及按钮等添加对应的图形标识,通过代码或资源导入方式加载这些图像时往往会有较高的格式要求. 比如,为按 ...
- JS的十大经典算法排序
引子 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements JavaScript. 当年,想凭借抱Java大腿火一把而不惜把自己名字给改了的JavaScript(原名LiveScript ...
- loadsh这个神奇的js工具类库
var _ = require('lodash'); 把几个对象合并为一个对象. _.assign({ 'a': 1 }, { 'b': 2 }, { 'c': 3 });// ➜ { 'a': 1, ...
- (练习)rational rose进行用例图设计
用例图:
- Weblogic 启动报错:java.lang.NoClassDefFoundError
Weblogic 启动报错:java.lang.NoClassDefFoundError ####<2015-6-17 下午03时30分47秒 CST> <Error> &l ...