在ASP.NET MVC 2中的每个控制器操作之前,如何获得某些代码?

我想检查有关会话状态,用户代理等的一些事情,并可能采取行动,并在控制器方法有机会执行之前返回一个特殊的视图。 例如:

最常见的:
用户请求主页/索引
系统检查以确保x!= 0。
x不等于零,所以Home / Index控制器像正常一样执行。

但是有时:
用户请求主页/索引
系统检查以确保x!= 0。
x等于零。 用户必须被通知,并且所请求的控制器动作不能被允许执行。

认为这涉及使用ActionFilters。 但是我已经阅读了他们,我不明白,如果我可以抢占控制器的方法,并返回一个视图执行之前。 我确信我可以在控制器方法运行之前执行代码,但是如何避免它在某些情况下运行并返回自定义视图,或者直接转到其他控制器方法?

更新:我实施了RM的解决scheme。 这就是我所做的:

public class MyAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (myValue == wrongValue) { filterContext.Result = new ViewResult{ViewName = "Notice"}; } base.OnActionExecuting(filterContext); } } 

现在,当myValue错误时,这些用户将获得通知视图,并且所请求的控制器将永远不会执行。 为了使这个工作,我把它应用到我所有的控制器inheritance的ControllerBase。

一切都取决于你想要做什么,以及如何。 以下三个选项:


你可以使用路由约束。 在评估匹配的路线时执行它们。

 routes.MapRoute( "HomeWithConstraint", "Home/{action}", new {controller="Home", action="index"}, new { x = new MyCustomRouteConstraint () } ); // without constraint, ie if above didnt pass routes.MapRoute( "HomeWithConstraint", "Home/{action}", new {controller="Home", action="index"} ); 

上面的MyCustomRouteConstrainttypes会在你的例子中检查x == 0等。 不确定你想要做什么,但是这将允许你在运行前检查条件,并设置额外的路线值等。

请参阅此处的自定义路由约束示例。


另外,是的,你可以使用一个自定义的ActionFilter,只是将它应用到控制器类,它将在执行任何操作之前被调用。 就像是:

 public class CheckXActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if(x == 0) { // do something // eg Set ActionParameters etc } else { // do something else } } } 

另一种select是让所有控制器(或相关控制器)从您制作的自定义控制器inheritance,并覆盖:

 OnActionExecuting 

详情请看这里 。

要像filter一样做,或者路由约束。

你可以这样做的一个方法是redirect到一个不同的ActionMethod来显示视图。 代码示例是在这个讨论中:

redirect到指定的控制器和动作在asp.net mvc行动filter