是否可以跳过整个操作方法执行,并在ActionResult
满足某个条件时返回特定的OnActionExecuting
?
答案 0 :(得分:34)
请参阅我的下载示例和MSDN文章Filtering in ASP.NET MVC。
您可以通过将OnActionExecuting
属性设置为非空值来取消OnResultExecuting
和Result
方法中的过滤器执行。
不会调用任何待处理的OnActionExecuted
和OnActionExecuting
过滤器,并且调用者不会针对已取消的过滤器或待处理过滤器调用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
};
}
}