Asp.net mvc 4 以编程/动态方式排除ActionFilter

Asp.net mvc 4 以编程/动态方式排除ActionFilter,asp.net-mvc-4,c#-4.0,actionfilterattribute,Asp.net Mvc 4,C# 4.0,Actionfilterattribute,我有一个ActionFilterAttribute,它使用OnActionExecuted在控制器动作生成ViewModel后对其进行一些操作。在某些情况下(例如,如果满足条件,我只想重定向,而不关心ViewModel),我不希望执行ActionFilter 如何以编程方式告诉ActionFilter不要执行 与此相关的是这篇文章,在这里您可以修饰操作以排除可能在GlobalFilterCollection中设置的属性(或在控制器上设置并在操作上排除):最简单的方法是简单地向ActionFilt

我有一个ActionFilterAttribute,它使用OnActionExecuted在控制器动作生成ViewModel后对其进行一些操作。在某些情况下(例如,如果满足条件,我只想重定向,而不关心ViewModel),我不希望执行ActionFilter

如何以编程方式告诉ActionFilter不要执行


与此相关的是这篇文章,在这里您可以修饰操作以排除可能在GlobalFilterCollection中设置的属性(或在控制器上设置并在操作上排除):

最简单的方法是简单地向ActionFilter添加代码以检测条件,如果条件为真,则不执行代码

但是,如果出于某种原因不想更改过滤器,可以在提供的链接中使用FilterProvider技术。但是,您可以编写过滤器提供程序来检测条件并排除过滤器

这里的问题是,您没有告诉我们您需要什么样的条件,也没有告诉我们您打算如何确定它应该适用于哪些操作

这里只是猜测,但你可以这样做:

[MyAttribute]
public class HomeController : Controller
{
    [ExcludeFilter(typeof(MyAttribute), typeof(MyFilterCondition)]
    public ActionResult Index()
    {
        return View();
    }
}
然后,您将创建一个MyFilterCondition类,该类将基于您定义的某个接口,以便它具有已知的约定。。例如IFilterCondition(您创建了它,但它不存在)

然后创建与链接类似的自定义ExcludeFilterAttribute和ExcludeFilterProvider,但向ExcludeFilterAttribute添加额外的筛选条件类型,用于确定要排除筛选的条件,然后向筛选器提供程序添加一些附加逻辑,该提供程序使用反射根据该类型获取新的IFilterCondition实例,并调用Exclude()方法确定是否要排除筛选器


然而,这一切仍然是非常静态的,需要在编译时定义要过滤的操作以及要过滤的条件。如果您需要更大的灵活性,那么您可能希望重新考虑使用过滤器的方式,因为它们在更高级别的管道中执行,并且需要让您的手更脏来调整它。

问题中的链接现在已经失效。这是2019年11月该文章的最新版本。
public interface IFilterCondition
{
    bool Exclude();
}

public class MyFilterCondition : IFilterCondition
{
    public bool Exclude()
    {
         // logic that determines whether to exclude the attribute
    }
}