在任何操作之前执行代码

16

我有以下需求:

在每个对我的网页的请求中,无论用户试图调用哪个操作,我都需要调用一些代码以检查资源是否已就位。如果是,则一切正常,应按正常方式调用操作方法。

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

所以,在任何操作方法之前运行一个方法并具有取消对操作方法的调用并执行其他操作的选项是否可能?


你可以实现自己的 HttpModule,或者将你的检查放在 global.asax.cs 中的 Application_BeginRequest() 方法中。 - rejj
另一个选项是使用自定义中间件,它允许您精细调整代码运行的时间:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0 - Mladen B.
1
@MladenB. 中间件是核心的东西。我从标签中推断出这不是。 - Jag
2个回答

24

查看全局操作筛选器(自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访问数据库记录,则应该如何在操作过滤器中检查?这不是正确的答案。 - user786

8
MVC提供了几个钩子来实现此功能。
在基础控制器中,您可以重写Controller.OnActionExecuting(context)方法,在操作执行之前触发。您可以将context.Result设置为任何ActionResult(例如RedirectToAction),以覆盖该操作。
或者,您可以创建一个ActionFilterAttribute,并像上面那样重写OnActionExecuting方法。然后,只需将该属性应用于需要它的任何控制器即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接