Фильтры действий на контроллере, но используются только в том случае, если к методу применяется другое ([HttpPost])? - PullRequest
3 голосов
/ 03 декабря 2011

Я бы хотел применить фильтр на уровне контроллера, но его логика применима только к методам действия, которые имеют фильтр [HttpPost] напрямую.

Возможно, из одного фильтра можно определить, был ли применен другой фильтр к текущему методу действия?

Или есть другой способ достижения эффекта, который я обрисовал в первом предложении? Возможно, есть способ расширения или замены HttpFilter?

Ответы [ 2 ]

3 голосов
/ 03 декабря 2011

Я думаю, это то, что вы ищете:

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...                         
    }
}
0 голосов
/ 03 декабря 2011

Ну, 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);
...