当属性触发时,我可以测试是否在Controller或Action上设置了吗?
我想要的行为是:如果存在则使用Action属性,否则使用Controller属性。像这样:
public class TestAttribute : FilterAttribute, IAuthorizationFilter
{
public TestAttribute(string optionalParam = "") { /*...*/ }
public void OnAuthorization(AuthorizationContext filterContext)
{
bool isClassAttribute; // = ????
bool hasActionAttribute = filterContext.ActionDescriptor.GetCustomAttributes(typeof(TestAttribute ), false).Length > 0;
if (isClassAttribute && hasActionAttribute)
return; // handle in Action attribute
else
; // do stuff with optionalParam...
}
}
[TestAttribute]
public class TestClass
{
[TestAttribute(optionalParam:"foo"]
public ActionResult TestMethod() { return null; }
}
我可以使用Order属性执行此操作,但不希望每次都设置它(或get funky)。
编辑/解决方案
好的,找到了我的问题的解决方案(但不是问题) - 设置属性基础参数AllowMultiple = false意味着last instance of the same filter type is allowed, and all others are discarded
(并且Controller属性首先运行(?)所以应该很好... )。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class TestAttribute : FilterAttribute, IAuthorizationFilter
{
public TestAttribute(string optionalParam = "") { /*...*/ }
public void OnAuthorization(AuthorizationContext filterContext)
{
// this should be the Action attribute (if exists), else the Controller attribute...
}
}
无论如何我问了一个稍微不同的问题,所以仍然会给出答案分数;)
答案 0 :(得分:0)
我相信该项目在每个方法调用上都会执行,但您可以参考:
public void OnActionExecuting(ActionExecutingContext filterContext) { } .. .. string controllerName = filterContext.Controller.GetType().Name; //either or: string actionMethodName = filterContext.ActionDescriptor.ActionName; string actionMethodName = filterContext.RouteData.Values["action"].ToString();
如果你的actionMethodName为null,那么它可能来自你的控制器 - 尽管就像我说的那样,只有当一个动作方法被调用时它们才会被调用(虽然测试了上面的代码,但不是100%肯定)应该回答你的问题)
希望有所帮助:)