我想在控制器級別應用過濾器,但只有邏輯適用於直接具有[HttpPost]過濾器的操作方法。控制器上的操作過濾器,但僅在另一個([HttpPost])應用於方法時使用?
也許有可能從一個過濾器內檢測是否在當前操作方法上應用了另一個過濾器?
或者還有另外一種方法可以達到我在第一句中列出的效果嗎?也許有擴展或替換HttpFilter的方法?
我想在控制器級別應用過濾器,但只有邏輯適用於直接具有[HttpPost]過濾器的操作方法。控制器上的操作過濾器,但僅在另一個([HttpPost])應用於方法時使用?
也許有可能從一個過濾器內檢測是否在當前操作方法上應用了另一個過濾器?
或者還有另外一種方法可以達到我在第一句中列出的效果嗎?也許有擴展或替換HttpFilter的方法?
那麼,HttpPostAttribute是密封的。但你可以窺探它(ILSpy是你的朋友)的靈感:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class HttpPostAttribute : ActionMethodSelectorAttribute
{
private static readonly AcceptVerbsAttribute _innerAttribute = new AcceptVerbsAttribute(HttpVerbs.Post);
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
return HttpPostAttribute._innerAttribute.IsValidForRequest(controllerContext, methodInfo);
}
}
很簡單吧?你只需要創建完全相同的邏輯,作爲回報,把
return (yourCustomCondition) && HttpPostAttribute._innerAttribute.IsValidForRequest(controllerContext, methodInfo);
我認爲這是你在找什麼:
public class PostActiongFilter : ActionFilterAttribute
{
public virtual void OnActionExecuting(ActionExecutingContext filterContext)
{
var actionName = filterContext.ActionDescriptor.ActionName;
var actionParams = filterContext.ActionDescriptor.GetParameters
var actionParamsTypes = actionParams.Cast<ParameterDescriptor>()
.Select(x => x.ParameterType).ToArray();
var controllerType = filterContext.Controller.GetType();
var actionMethodInfo = controllerType.GetMethod(actionName,
actionParamsTypes, null);
var isMethodPost = actionMethodInfo.IsDefiend(typeof(HttpPostAttribute),
false);
if (!isMethodPost)
return;
// Do what you want for post here...
}
}
這個答案是不是真的,因爲的內部邏輯的通用解決方案HttpPost屬性可能會在更高版本的MVC中更改,然後此解決方案將停止工作。在這種情況下,@gdoron提供的答案要好得多。 – Anton