创建一个动作过滤器属性,绕过动作的实际执行并为其返回值

mat*_*ndr 3 asp.net attributes actionfilterattribute

我可以创建一个绕过动作的实际执行并为其返回值的ActionFilterAttribute吗?

Tim*_*ora 6

对的,这是可能的.您可以设置覆盖时提供给您的过滤背景的结果OnActionExecutingActionFilterAttribute.

using System.Web.Mvc;

public sealed class SampleFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting( ActionExecutingContext filterContext )
    {
        filterContext.Result = new RedirectResult( "http://google.com" );
    }
}
Run Code Online (Sandbox Code Playgroud)

在源代码中,您可以看到设置Result筛选器上下文的属性会更改流程.

来自System.Web.Mvc.ControllerActionInvoker:

internal static ActionExecutedContext InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func<ActionExecutedContext> continuation)
{
    filter.OnActionExecuting(preContext);
    if (preContext.Result != null)
    {
        return new ActionExecutedContext(preContext, preContext.ActionDescriptor, true /* canceled */, null /* exception */)
        {
            Result = preContext.Result
        };
    }

    // other code ommitted
}
Run Code Online (Sandbox Code Playgroud)