我有一个ActionFilterAttribute,它使用OnActionExecuted在Controller Action生成ViewModel之后对其进行一些操作。在某些情况下(例如,如果满足条件,我只想重定向并且不关心ViewModel)我不希望ActionFilter执行。
我如何以编程方式告诉ActionFilter不执行?
相关的是这篇文章,您可以在其中修饰Action以排除可能在GlobalFilterCollection中设置的属性(或在控制器上设置并在操作中排除):http://blogs.microsoft.co.il/oric/2011/10/28/exclude-a-filter/
答案 0 :(得分:1)
最简单的方法是简单地向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,用于确定排除过滤器的条件,然后向Filter添加一些其他逻辑使用反射获取基于该类型的新IFilterCondition实例的提供程序,并调用Exclude()方法以确定是否要排除过滤器。
但是,这仍然是非常静态的,并且要求您在编译时定义要过滤的操作以及要过滤的条件。如果你需要更多的灵活性,那么你可能希望以你使用它们的方式重新考虑使用过滤器,因为它们在更高级别的管道中执行,并且需要让你的手更加肮脏以进行调整。