如何从ActionFilter跳过动作执行?

时间:2012-03-23 09:59:59

标签: asp.net-mvc action-filter

是否可以跳过整个操作方法执行,并在ActionResult满足某个条件时返回特定的OnActionExecuting

4 个答案:

答案 0 :(得分:34)

请参阅我的下载示例和MSDN文章Filtering in ASP.NET MVC

您可以通过将OnActionExecuting属性设置为非空值来取消OnResultExecutingResult方法中的过滤器执行。

不会调用任何待处理的OnActionExecutedOnActionExecuting过滤器,并且调用者不会针对已取消的过滤器或待处理过滤器调用OnActionExecuted方法。

以前运行的过滤器的OnActionExecuted过滤器将会运行。所有OnResultExecutingand OnResultExecuted过滤器都会运行。

示例中的以下代码显示了在ActionResult中满足特定条件时如何返回特定OnActionExecuting

if (filterContext.RouteData.Values.ContainsValue("Cancel")) 
{
    filterContext.Result = new RedirectResult("~/Home/Index");
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}

答案 1 :(得分:22)

您可以使用filterContext.Result。它应该是这样的:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    //Check your condition here
    if (true)
    {
        //Create your result
        filterContext.Result = new EmptyResult();
    }
    else
        base.OnActionExecuting(filterContext);
}

答案 2 :(得分:2)

您可以在此处使用以下代码。

public override void OnActionExecuting(ActionExecutingContext filterContext)
 {
    ...
    if (needToRedirect) //your condition here
    {
       ...
       filterContext.Result = new RedirectToAction(string action, string controller)
       return;
    }
    ...
 }

RedirectToAction将根据条件将特定操作重定向到您。

答案 3 :(得分:0)

如果有人在MVC 5 API中扩展ActionFilterAttribute,那么您必须获取HttpActionContext而不是ActionExecutingContext作为参数类型。在这种情况下,只需将httpActionContext.Response设置为新的HttpResponseMessage,就可以了。

我正在制作一个验证过滤器,它是这样的:

    /// <summary>
    /// Occurs before the action method is invoked.
    /// This will validate the request
    /// </summary>
    /// <param name="actionContext">The http action context.</param>
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        ApiController ctrl = (actionContext.ControllerContext.Controller as ApiController);
        if (!ctrl.ModelState.IsValid)
        {
            var s = ctrl.ModelState.Select(t => new { Field = t.Key, Errors = t.Value.Errors.Select(e => e.ErrorMessage) });
            actionContext.Response = new System.Net.Http.HttpResponseMessage()
            {
                Content = new StringContent(JsonConvert.SerializeObject(s)),
                ReasonPhrase = "Validation error",
                StatusCode = (System.Net.HttpStatusCode)422
            };
        }
    }