日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/2 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、ActionMethodSelectorAttribute

  其是一個(gè)抽象類(lèi),繼承自Attribute,子類(lèi)有NonActionAttribute、HttpGetAttribute、HttpPostAttribute、HttpPutAttribute、HttpDeleteAttribute、HttpPatchAttribute、HttpHeadAttribute、HttpOptionsAttribute和AcceptVerbsAttribute,其唯一抽象方法IsValidForRequest,如果返回false,結(jié)果會(huì)提示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,內(nèi)部都是通過(guò)AcceptVerbsAttribute 來(lái)實(shí)現(xiàn)的,如HttpGetAttribute,其他都類(lèi)似

[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

  其是一個(gè)抽象類(lèi),繼承自Attribute,子類(lèi)有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){
       //只是驗(yàn)證根據(jù)請(qǐng)求進(jìn)行路由匹配出的actionName,是否和ActionName特性上指定的Name相等
return String.Equals(actionName, Name, StringComparison.OrdinalIgnoreCase);}}

三、自定義ActionMethodSelectorAttribute

  驗(yàn)證請(qǐng)求是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;}}

?

轉(zhuǎn)載于:https://www.cnblogs.com/shawnhu/p/8401338.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET MVC ActionMethodSelectorAttribute 以及HttpGet等Action特性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。