一、ActionMethodSelectorAttribute

  其是一个抽象类,继承自Attribute,子类有NonActionAttribute、HttpGetAttribute、HttpPostAttribute、HttpPutAttribute、HttpDeleteAttribute、HttpPatchAttribute、HttpHeadAttribute、HttpOptionsAttribute和AcceptVerbsAttribute,其唯一抽象方法IsValidForRequest,如果返回false,结果会提示Action Not Found

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public abstract class ActionMethodSelectorAttribute : Attribute
{public abstract bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo);
}  

AcceptVerbsAttribute 直接继承 ActionMethodSelectorAttribute
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public sealed class AcceptVerbsAttribute : ActionMethodSelectorAttribute{public AcceptVerbsAttribute(HttpVerbs verbs): this(EnumToArray(verbs)){}public AcceptVerbsAttribute(params string[] verbs){if (verbs == null || verbs.Length == 0){throw new ArgumentException(MvcResources.Common_NullOrEmpty, "verbs");}Verbs = new ReadOnlyCollection<string>(verbs);}public ICollection<string> Verbs { get; private set; }private static void AddEntryToList(HttpVerbs verbs, HttpVerbs match, List<string> verbList, string entryText){if ((verbs & match) != 0){verbList.Add(entryText);}}internal static string[] EnumToArray(HttpVerbs verbs){List<string> verbList = new List<string>();AddEntryToList(verbs, HttpVerbs.Get, verbList, "GET");AddEntryToList(verbs, HttpVerbs.Post, verbList, "POST");AddEntryToList(verbs, HttpVerbs.Put, verbList, "PUT");AddEntryToList(verbs, HttpVerbs.Delete, verbList, "DELETE");AddEntryToList(verbs, HttpVerbs.Head, verbList, "HEAD");AddEntryToList(verbs, HttpVerbs.Patch, verbList, "PATCH");AddEntryToList(verbs, HttpVerbs.Options, verbList, "OPTIONS");return verbList.ToArray();}public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo){if (controllerContext == null){throw new ArgumentNullException("controllerContext");}string incomingVerb = controllerContext.HttpContext.Request.GetHttpMethodOverride();return Verbs.Contains(incomingVerb, StringComparer.OrdinalIgnoreCase);}}

  除了NonActionAttribute,内部都是通过AcceptVerbsAttribute 来实现的,如HttpGetAttribute,其他都类似

  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public sealed class HttpGetAttribute : ActionMethodSelectorAttribute{private static readonly AcceptVerbsAttribute _innerAttribute = new AcceptVerbsAttribute(HttpVerbs.Get);public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo){return _innerAttribute.IsValidForRequest(controllerContext, methodInfo);}}

  NonActionAttribute,IsValidForRequest直接返回false

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public sealed class NonActionAttribute : ActionMethodSelectorAttribute{public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo){return false;}}

二、ActionNameSelectorAttribute

  其是一个抽象类,继承自Attribute,子类有ActionNameAttribute

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public abstract class ActionNameSelectorAttribute : Attribute{public abstract bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo);}

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]public sealed class ActionNameAttribute : ActionNameSelectorAttribute{public ActionNameAttribute(string name){if (String.IsNullOrEmpty(name)){throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");}Name = name;}public string Name { get; private set; }public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo){       //只是验证根据请求进行路由匹配出的actionName,是否和ActionName特性上指定的Name相等return String.Equals(actionName, Name, StringComparison.OrdinalIgnoreCase);}}

三、自定义ActionMethodSelectorAttribute

  验证请求是GET而且是ajax的

 public class MyActionMethodSelectorAttribute : ActionMethodSelectorAttribute{public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo){//get/poststring httpMethodOverride = controllerContext.HttpContext.Request.GetHttpMethodOverride();//isAjaxvar isAjax = controllerContext.HttpContext.Request.IsAjaxRequest();var b = httpMethodOverride.ToLower() == "get" && isAjax;return b;}}

转载于:https://www.cnblogs.com/shawnhu/p/8401338.html

ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性相关推荐

  1. 从零开始学习 ASP.NET MVC 1.0 (三) Controller/Action 深入解析与应用实例 【转】

    一.摘要 一个Url请求经过了Routing处理后会调用Controller的Action方法. 中间的过程是怎样的? Action方法中返回ActionResult对象后,如何到达View的? 本文 ...

  2. 使用ASP.NET MVC Futures 中的异步Action

    在ASP.NET MVC中使用异步是比较麻烦的,从RC1版开始ASP.NET MVC Futures中提供了几个支持异步的类. 相关的类有:AsyncActionDescriptor.AsyncCon ...

  3. 使用ASP.NET MVC Futures 中的异步Action 【转】

    之前看过老赵这两篇文章.也研究了一下老赵异步的实现方式. 不过感觉自己扩展的话,在ASP.NET MVC中使用异步还真是麻烦,刚好看到从RC1版开始 ASP.NET MVC Futures中提供了几个 ...

  4. ASP.NET MVC什么时候使用异步Action

    在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() { CustomerHelper cHelper = new Custom ...

  5. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】

    Html.partial和RenderPartial的用法与区别 Html.partial和RenderPartial都是输出html片段,区别在于 Partial是将视图内容直接生成一个字符串并返回 ...

  6. 转载ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别

    对这四个的区别做一个总结,清理一下思路,方便以后使用: 1.带有Render的方法返回值是void,在方法内部进行输出:不带的返回值类型为MvcHtmlString,所以只能这样使用:     @Ht ...

  7. 走入asp.net mvc不归路:[4]说说Action有哪些常见成员

    一个控制器中,功能最终会落实到一个个Action中实现,最常见的是增删查改操作.这些Action是一个个的方法,一般返回值是ActionResult,并且是public 方法,可以带参数,可以添加元标 ...

  8. 理解ASP.NET MVC Framework Action Filters(翻的)

    原文地址:Understanding Action Filters 本指南主要解释action filters,action filter作为一个可以应用到controller action(或者是整 ...

  9. ASP.NET MVC Action Filters

    在看这篇Fun with Http Headers in ASP.NET MVC Action Filters的时候,提到了 Roni Schuetz在codeplex上创建的一个项目ASP.NET ...

最新文章

  1. Java中的注解到底是如何工作的?
  2. 【Python刷题】_1
  3. CSS特效(1)——css伪类实现表单验证样式
  4. colab长时间处于正在连接
  5. oracle 邻接模型,【原创】MySQL 模拟Oracle邻接模型树形处理
  6. 用fiddler抓包小程序
  7. debian10树莓派4安装mysql_树莓派 4 发布!新 OS 基于 Debian 10 Buster
  8. oracle any 语法,Oracle Any/Some
  9. shell基础之多功能nginx(安装、重启、停止等)
  10. wifi定位算法 java_机器学习在滴滴网络定位中的探索和实践
  11. 大数据平台解决方案(PPT)
  12. 川轻化c语言实验答案,C语言实验目().doc
  13. 另辟蹊径,挑战网络战争
  14. Python 批处理文件(全)
  15. 不占广告位增加网站收入揭秘
  16. OSPF高级特性—Distribute-list过滤、修改接口OSPF优先级配置、OSPF—被动接口详解、修改参考带宽值
  17. vue-cli-service build 环境设置
  18. Ternary weight networks
  19. Re33:读论文 Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Languag
  20. 华为路由器显示连接到服务器失败怎么办,华为路由WS5200可以搜到wifi但无法连接怎么办...

热门文章

  1. u盘插在linux电脑上没有反应,U盘插在自己电脑上没有反应,别人电脑有反应的解决方法...
  2. php怎样完成批量审核,CMS_DedeCMS 批量取消审核文档的实现方法,今天修改了几个地方的代码 实 - phpStudy...
  3. 适合利用计算机模拟的是,计算机模拟在数学建模中的应用
  4. mysql 中间表的好处_Mysql中使用中间表提高统计查询速度
  5. iphone新旧手机数据传输已取消_如何取消iPhone手机App自动扣费?三种方法让你不再被“偷”...
  6. mysql中常见查询表_MySQL中常见查询
  7. mysql中如何卸载插件_Eclipse中如何卸载插件
  8. return两个返回值_LeetCode 第四题 寻找两个有序数组的中位数
  9. android: a system image must be selected to continmue
  10. 数字非压缩光端机的选购原则