我有以下要求:
对于我的网页的每个请求,无论用户尝试调用哪个操作,我都需要调用一些代码来检查资源是否到位。如果是,那么一切都很好,并且应该正常调用action方法。
但是,如果此资源不可用,我希望所有请求都返回一个单独的页面,要求用户从可用的资源列表中选择另一个资源。
那么有可能在任何一个动作方法之前运行一个方法,该方法可以选择取消对动作方法的调用,而不是做其他事情吗?
答案 0 :(得分:19)
查看全局操作过滤器(自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());
然后,您可以覆盖OnActionExecuting方法,并使用RedirectToRouteResult设置Result属性。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (IsMyResourceAvailable())
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{ "Controller", "YourControllerName" },
{ "Action", "YourAction" }
});
}
base.OnActionExecuting(filterContext);
}
答案 1 :(得分:6)
MVC提供了几个钩子来做到这一点。
在基本控制器中,您可以覆盖在执行操作之前触发的Controller.OnActionExecuting(context)
。您可以将context.Result
设置为任何ActionResult(例如RedirectToAction)以覆盖该操作。
或者,您可以创建ActionFilterAttribute
,与上面完全相同,您可以覆盖OnActionExecuting
方法。然后,您只需将该属性应用于任何需要它的控制器。