ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 中map_Java中Map集合

1. Java中Map集合1. Map中value可以重复&#xff0c;key不能重复。对于重复的key值来说&#xff0c;后放置的值对覆盖前放置的值。import java.util.HashMap;public class MapTest1{public static void main(String[] args){HashMap map new HashMap();map.put("a",…

如何在Java中对文件进行模式匹配和显示相邻行

最近&#xff0c;我们在jOOλ0.9.9中发布了有关超棒的窗口函数支持的文章 &#xff0c;我相信这是对我们所做的库的最佳补充。 今天&#xff0c;我们将在一个用例中研究窗口函数的出色应用&#xff0c;该用例受到以下堆栈溢出问题Sean Nguyen的启发&#xff1a; 如何从Java 8…

64位内核第二讲,进程保护之对象钩子

64位内核第二讲,进程保护. 一丶什么是保护. 什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内核已经做了保护. 那么去掉保护的前提就是你要给自己的软件做保护. 比如我们给计算器做保护. 例如下图. 做保护.以前的病毒作者.都是想要退出…

java 类 request_java普通类得到request对象

使用拦截器import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.…

Xamarin.Forms Button长按事件

Xamarin.Forms Button长按事件 在平时的开发中&#xff0c;我们经常遇到需要Button能够拥有长按事件&#xff0c;但是在Xamarin.Forms中Button并没有该事件&#xff0c; 此时我们如何来实现呢&#xff1f; 我们知道在Xamarin.Forms中可以通过CustomRenderer来根据不同平台各自处…

java对象写入文件_将Java对象写入文件中

Java对象序列化 首先介绍一下对象序列化的目标:对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。 一、序列化的含义和意义: 序列化机制使得对象可以脱离程序的运行而独立存在。 对象的序列化指将一个Java对象写入IO流中,与此对应的反是,对象的反序列化…

jpql hql_无需部署即可测试JPQL / HQL

jpql hql您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL&#xff1f; 我们今天在这里看到的是适用于任何JPA实现的简单解决方案&#xff1a;Hibernate&#xff0c;OpenJPA&#xff0c;EclipseLink等。 这篇文章中找到的基本源代码来自本书&#xff1a;“ Pro JPA 2&a…

eclipse 代码上传github 笔记

第一步 先share project 如图所示 第二步 如果所示 第三步 点击 下面的create 然后点击完成 第四步提交 第五步&#xff1a; 第六步&#xff1a; 转载于:https://www.cnblogs.com/a8457013/p/8410471.html

java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

笔者以前学过C语言。众所周知&#xff0c;C也是一门面向对象程序设计语言。还记得当时在大学的时候&#xff0c;老师讲过这样的话&#xff1a;类的构造函数不应该设置成private权限&#xff0c;这样的话还怎么去实例化类的对象&#xff1f;当时也信以为然。现在在学java&#x…

[Usaco2008 Feb]Eating Together麻烦的聚餐

Description 为了避免餐厅过分拥挤&#xff0c;FJ要求奶牛们分3批就餐。每天晚饭前&#xff0c;奶牛们都会在餐厅前排队入内&#xff0c;按FJ的设想所有第3批就餐的奶牛排在队尾&#xff0c;队伍的前端由设定为第1批就餐的奶牛占据&#xff0c;中间的位置就归第2批就餐的奶牛了…

Keycloak SSO集成到jBPM和Drools Workbench中

介绍 单一登录&#xff08;SSO&#xff09;和相关令牌交换机制正在成为Web上不同环境中进行身份验证和授权的最常见方案&#xff0c;尤其是在迁移到云中时。 本文讨论了Keycloak与jBPM或Drools应用程序的集成&#xff0c;以便使用Keycloak上提供的所有功能。 Keycloak是用于浏…

接口 java性能_接口测试性能测试

接口测试 接口测试是测试系统组件间接口的一种测试&#xff0c;主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 原理 通过测试程序模拟客户端向服务…

C 标准库 - string.h

C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays.string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。库变量 size_t Unsigned integral type (type )这是无符号整数类型&#xff0c;它是 sizeof 关键…

Redis 小结

一、redis简介 redis是一款基于C语言编写的&#xff0c;开源的非关系型数据库&#xff0c;由于其卓越的数据处理机制&#xff08;按照规则&#xff0c;将常用的部分数据放置缓存&#xff0c;其余数据序列化到硬盘&#xff09;&#xff0c;大家也通常将其当做缓存服务器来使用。…

NetBeans Java EE技巧#1 –数据库中的实体类

NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说&#xff0c;我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中&#xff0c;不仅Java EE的生产力提高了&#xff0c;而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBeans成为绝配&#x…

asp mysql添加数据_ASP:ado.net 实例向数据库添加数据。

我在这使用的是老师给的数据库1&#xff0c;web窗体设计。设计添加图书窗体&#xff0c;窗体属性有图书种类(下拉列表框控件)&#xff0c;图书名称&#xff0c;作者&#xff0c;编号&#xff0c;出版社&#xff0c;价格均为文本框&#xff0c;日期(第三方日期控件)&#xff0c;…

spring jmx_JMX和Spring –第1部分

spring jmx这是三篇文章的第一篇&#xff0c;这三篇文章将展示如何通过JMX支持为Spring应用程序赋能。 Maven配置 这是用于设置此示例代码的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

守口住嘴

守口 祸从口出 病从口入 住嘴 嘴能成事 亦能坏事 守口 祸从口出 病从口入 住嘴 嘴能成事 亦能坏事 转载于:https://www.cnblogs.com/fangtengfei/p/8416073.html

JAVA有percentile函数吗_Python numpy.percentile函数方法的使用

numpy.percentilenumpy.percentile(a, q, axisNone, outNone, overwrite_inputFalse, interpolationlinear, keepdimsFalse) [source]计算沿指定轴的数据的第q个百分位数。返回数组元素的第q个百分点。参数 &#xff1a;a &#xff1a;array_like输入数组或可以转换为数组的…

C代码的运行速度总是比Java快,对吧? 错误!

因此&#xff0c;我们都知道&#xff0c;Java解释缓慢且C的编译和优化运行速度非常快。 您可能知道&#xff0c;图片截然不同。 TL; DR Java适用于星座&#xff0c;它的速度更快&#xff0c;在JIT上可以执行内联&#xff0c;因为所有方法/功能都是可见的&#xff0c;而C编译器…