我有以下需求:
在每个对我的网页的请求中,无论用户试图调用哪个操作,我都需要调用一些代码以检查资源是否已就位。如果是,则一切正常,应按正常方式调用操作方法。
但是,如果此资源不可用,则希望所有请求返回一个单独的页面,要求用户从可用资源列表中选择另一个资源。
所以,在任何操作方法之前运行一个方法并具有取消对操作方法的调用并执行其他操作的选项是否可能?
我有以下需求:
在每个对我的网页的请求中,无论用户试图调用哪个操作,我都需要调用一些代码以检查资源是否已就位。如果是,则一切正常,应按正常方式调用操作方法。
但是,如果此资源不可用,则希望所有请求返回一个单独的页面,要求用户从可用资源列表中选择另一个资源。
所以,在任何操作方法之前运行一个方法并具有取消对操作方法的调用并执行其他操作的选项是否可能?
查看全局操作筛选器(自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);
}
IsMyResourceAvailable
并在过滤器中调用它。例如,如果用户未经身份验证,并使用ID访问数据库记录,则应该如何在操作过滤器中检查?这不是正确的答案。 - user786Controller.OnActionExecuting(context)
方法,在操作执行之前触发。您可以将context.Result
设置为任何ActionResult(例如RedirectToAction),以覆盖该操作。ActionFilterAttribute
,并像上面那样重写OnActionExecuting
方法。然后,只需将该属性应用于需要它的任何控制器即可。
Application_BeginRequest()
方法中。 - rejj