【问题标题】:How do I get certain code to execute before every single controller action in ASP.NET MVC 2?如何在 ASP.NET MVC 2 中的每个控制器操作之前执行某些代码?
【发布时间】:2010-04-16 02:48:11
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 嘿克里斯。告诉我你是怎么做的?

标签: asp.net-mvc


【解决方案1】:

一切都取决于您到底想做什么以及如何做。以下三个选项:


您可以为此使用路由约束。它们在评估要匹配的路由时执行。

routes.MapRoute(
    "HomeWithConstraint",
    "Home/{action}",
    new {controller="Home", action="index"},
    new { x = new MyCustomRouteConstraint () }
);

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

上面的 MyCustomRouteConstraint 类型将在您的示例中检查 x==0 等。不确定您到底想做什么,但这将允许您在运行前检查条件并设置其他路线值等。

请参阅here 以了解自定义路由约束的示例。


另外,是的,您可以使用自定义 ActionFilter,只需将其应用于控制器类,它就会在执行任何操作之前被调用。比如:

public class CheckXActionFilterAttribute : ActionFilterAttribute
{

      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
           if(x == 0)
           {
               // do something
               // e.g. Set ActionParameters etc
           }
           else
           {
               // do something else
           }
      }


}

另一种选择是让所有控制器(或相关控制器)从您制作的自定义控制器继承并覆盖:

OnActionExecuting

详情请见here

做同样的过滤,或者路由约束。

【讨论】:

    【解决方案2】:

    您可以这样做的一种方法是重定向到不同的 ActionMethod 以显示视图。代码示例在此讨论中:

    Redirecting to specified controller and action in asp.net mvc action filter

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2015-01-26
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多