在执行任何操作之前执行代码

Øyv*_*hen 14 .net asp.net asp.net-mvc asp.net-mvc-3

我有以下要求:

在每次向我的网页发出请求时,无论用户尝试调用哪个操作,我都需要调用一些代码来检查资源是否到位.如果是,那么一切都很好,并且应该正常调用action方法.

但是,如果此资源不可用,我希望所有请求都返回一个单独的页面,要求用户从可用的列表中选择另一个资源.

那么是否有可能在任何操作方法之前运行一个方法,该方法可以取消对操作方法的调用,而是执行其他操作?

yor*_*rah 20

查看全局操作过滤器(自asp.net mvc 3以来可用):http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

基本上,在您的Global.asax中,您可以在应用程序启动期间(在Application_Start()中)全局注册过滤器:

GlobalFilters.Filters.Add(new MyActionFilterAttribute());
Run Code Online (Sandbox Code Playgroud)

然后,您可以覆盖OnActionExecuting方法,并使用RedirectToRouteResult设置Result属性.

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (IsMyResourceAvailable())
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {
                { "Controller", "YourControllerName" },
                { "Action", "YourAction" } 
            });
    }

    base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*pey 6

MVC提供了几个钩子来做到这一点.

在基本控制器中,您可以Controller.OnActionExecuting(context)在操作执行之前覆盖哪些触发器.您可以设置context.Result为任何ActionResult(例如RedirectToAction)来覆盖该操作.

或者,您可以创建一个ActionFilterAttribute,并且与上面完全相同,您可以覆盖该OnActionExecuting方法.然后,您只需将该属性应用于任何需要它的控制器.