通过编程/动态方式排除ActionFilter



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

我如何通过编程告诉ActionFilter不执行?

相关的是这篇文章,你可以装饰动作,以排除可能在GlobalFilterCollection中设置的属性(或设置在控制器上,排除在动作上):http://blogs.microsoft.co.il/oric/2011/10/28/exclude-a-filter/

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

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

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

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

[MyAttribute]
public class HomeController : Controller
{
    [ExcludeFilter(typeof(MyAttribute), typeof(MyFilterCondition)]
    public ActionResult Index()
    {
        return View();
    }
}

然后你会创建一个MyFilterCondition类,它将基于你定义的一些接口,这样它就有一个已知的契约。如IFilterCondition(你创建的,它不存在)

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

然后你将创建自定义ExcludeFilterAttribute ExcludeFilterProvider类似于你的链接,但是你添加额外的过滤条件类型ExcludeFilterAttribute用于确定排除过滤器的条件,然后添加一些额外的逻辑过滤提供者使用反射来得到一个新的IFilterCondition实例根据类型和调用排除()方法来确定如果你想排除过滤器。

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

最新更新