Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 控制器上的操作筛选器,但仅当另一个([HttpPost])应用于方法时才使用?_Asp.net Mvc_Action Filter - Fatal编程技术网

Asp.net mvc 控制器上的操作筛选器,但仅当另一个([HttpPost])应用于方法时才使用?

Asp.net mvc 控制器上的操作筛选器,但仅当另一个([HttpPost])应用于方法时才使用?,asp.net-mvc,action-filter,Asp.net Mvc,Action Filter,我想在控制器级别应用一个过滤器,但它的逻辑只适用于直接使用[HttpPost]过滤器的操作方法 也许可以从一个过滤器中检测当前操作方法是否应用了另一个过滤器 还是有其他方法可以达到我在第一句话中概述的效果?也许有办法扩展或替换HttpFilter?嗯,HttpPostAttribute是密封的。但你可以窥视它(ILSpy是你的朋友)以获得灵感: [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited =

我想在控制器级别应用一个过滤器,但它的逻辑只适用于直接使用[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...                         
    }
}
公共类PostActionFilter:ActionFilterAttribute
{
公共虚拟void OnActionExecuting(ActionExecutingContext filterContext)
{
var actionName=filterContext.ActionDescriptor.actionName;
var actionParams=filterContext.ActionDescriptor.GetParameters
var actionParamsTypes=actionParams.Cast()
.Select(x=>x.ParameterType).ToArray();
var controllerType=filterContext.Controller.GetType();
var actionMethodInfo=controllerType.GetMethod(actionName,
actionParamsTypes,空);
var isMethodPost=actionMethodInfo.IsDefined(类型为(HttpPostAttribute)),
假);
如果(!isMethodPost)
返回;
//做你想在这里发布的。。。
}
}

最后一行中的更正:var isMethodPost=actionMethodInfo.IsDefined(typeof(HttpPostAttribute),false)@莱克,谢谢。顺便说一句,此网站允许您在需要时编辑\建议编辑。无论如何,谢谢你,你说得对。这个答案并不是一个通用的解决方案,因为在更高版本的MVC中,HttpPost属性的内部逻辑可能会改变,然后这个解决方案将停止工作。在这种情况下,@gdoron提供的答案要好得多。