以编程方式/动态排除ActionFilter

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

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

相关的是这篇文章,您可以修饰Action以排除可能在GlobalFilterCollection中设置的属性(或在控制器上设置并在操作上排除):http://blogs.microsoft.co.il/oric/2011/ 28分之10/排除-A-滤波器/


最简单的方法是简单地将代码添加到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实例,并调用Exclude()方法来确定是否要排除过滤器。

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

链接地址: http://www.djcxy.com/p/74435.html

上一篇: Programmatically/Dynamically Exclude ActionFilter

下一篇: Using Tempdata in a class