实现 IActionFilter

Par*_*osh 1 .net c# asp.net asp.net-mvc

我正在构建以下过滤器:

public class TestflowFilter : FilterAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var profileId = int.Parse(ClaimsPrincipal.Current.GetClaimValue("UserId"));
        var appId = int.Parse(filterContext.RouteData.Values["id"].ToString());

        if (profileId != 0 && appId != 0)
        {
            if (CheckIfValid(profileId, appId))
            {
                 // redirect
                 filterContext.Result = // url to go to
            }
        }
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
    }

}
Run Code Online (Sandbox Code Playgroud)

我实际上只需要OnActionExecuted,但由于IActionFilter是一个接口,所以我必须同时实现它们。OnActionExecuting如果我不需要发生任何事情,可以留空吗?还是需要调用 MVC 始终运行的基本版本?

另外,在该OnActionExecuted方法中,如果CheckIfValidtrue,我会重定向用户,但如果不是,我不会执行任何操作。可以吗,还是我需要设置一些属性filterContext

Wil*_*Ray 6

我实际上只需要 OnActionExecuted,但由于 IActionFilter 是一个接口,我必须同时实现它们。如果我不需要发生任何事情,是否可以将 OnActionExecuting 留空,或者我是否需要调用 MVC 始终运行的基本版本?

在这种情况下,将方法体留空是完全可以接受的。看起来不错!

另外,在 OnActionExecuted 方法中,如果 CheckIfValid 为 true,我会重定向用户,但如果不是,我不会执行任何操作,这样可以吗,还是我需要在 filterContext 上设置某些属性。

你的过滤器没问题。MVC 确实提供了一个名为 的不同抽象基类ActionFilterAttribute,它实现了这些接口,供您根据需要进行重写。您可以在此处阅读一篇很好的概述。如果您从该类派生,您的过滤器属性代码可以稍微简化:

public class TestflowFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var profileId = int.Parse(ClaimsPrincipal.Current.GetClaimValue("UserId"));
        var appId = int.Parse(filterContext.RouteData.Values["id"].ToString());

        if (profileId != 0 && appId != 0)
        {
            if (CheckIfValid(profileId, appId))
            {
                // redirect
                filterContext.Result = // url to go to
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)