为什么不捕获[HttpGet]和[HttpPost]属性?

时间:2016-07-20 20:11:04

标签: c# asp.net asp.net-mvc asp.net-routing

我有一段像

这样的代码
foreach(var controller in controllers)
{
   // ... 
   var actions = controller.GetMethods()
                           .Where(method => method.ReturnType == typeof(IHttpActionResult));
   foreach(var action in actions)
   {
      // ... 
      var httpMethodAttribute = action.GetCustomAttributes(typeof(System.Web.Mvc.ActionMethodSelectorAttribute), true).FirstOrDefault() as System.Web.Mvc.ActionMethodSelectorAttribute;
      // ... 
   }
}

但由于某些原因httpMethodAttribute总是null,即使我可以确认actionCustomAttribute isSystem.Web.Mvc.ActionMethodSelectorAttribute 。知道我做错了吗?

2 个答案:

答案 0 :(得分:3)

.row-eq-height{ display: flex; flex-wrap: wrap; } #col-7{ background-image:url('/site/templates/images/image.jpg'); border: none; } .opaque-7{ background-color:#24B5B0; filter: alpha(opacity=80); -moz-opacity: 0.8; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80); -khtml-opacity: 0.8; opacity: 0.8; padding-left:5%; padding-top:10%; padding-bottom:10%; bottom:0; margin-top:40%; position: absolute; float:right; } #col-7 h4{ color: white; text-align: left; } #col-7 h3{ color:white; text-align:left; margin-top:-10px; } #col-7 p{ color:white; text-align: left; } #btn-7{ background-color:#30CFCA; color:white; float:left; margin-top: 10%; margin-bottom: -6%; display: block; } 只获取您指定的确切类型的属性,搜索您正在调用GetCustomAttributes(..., true)的成员的继承层次结构。它不会从您正在搜索的属性类型中获取继承的属性。

要获得GetCustomAttributes,您需要致电HttpGetAttribute。与GetCustomAttributes(typeof(HttpGetAttribute), true)相同。

例如,如果您有一个操作方法HttpPostAttribute从父控制器覆盖一个方法,并且父级Foo有一个属性,则第二个参数会告诉Foo是否要返回父母自定义属性。

答案 1 :(得分:1)

一年太晚了,但是如果你想得到HttpMethodAttribute:

var httpMethodAttr = (HttpMethodAttribute)action.GetCustomAttributes()
                        .SingleOrDefault(a => typeof(HttpMethodAttribute).IsAssignableFrom(a.GetType());

或者类型是你之后的类型

var httpMethodType = (from a in action.GetCustomAttributes()
                      let t = a.GetType()
                      where typeof(HttpMethodAttribute).IsAssignableFrom(t)
                      select t).SingleOrDefault();
if (httpMethodType = null || httpMethodType == typeof(HttpGetAttribute))