【问题标题】:Executing code before any action在任何操作之前执行代码
【发布时间】:2012-02-01 07:26:35
【问题描述】:

我有以下要求:

对于我的网页的每个请求,无论用户尝试调用哪个操作,我都需要调用一些代码来检查资源是否到位。如果是,那么一切都很好,动作方法应该被正常调用。

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

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

【问题讨论】:

标签: asp.net .net asp.net-mvc asp.net-mvc-3


【解决方案1】:

查看全局操作过滤器(从 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 访问数据库记录,那么如何在操作过滤器中检查这一点。答案不对
【解决方案2】:

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

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

或者,您可以创建一个ActionFilterAttribute,就像上面一样,您覆盖OnActionExecuting 方法。然后,您只需将该属性应用于任何需要它的控制器。

【讨论】:

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