实现IActionFilter

时间:2016-04-21 19:50:36

标签: c# asp.net .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)
    {
    }

}

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

如果OnActionExecutedCheckIfValidtrue方法也是filterContext,我会重定向用户,但如果不是,我就不会做任何事情。是的还是我需要在{{1}}上设置一些属性。

1 个答案:

答案 0 :(得分:3)

  

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

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

  

同样在OnActionExecuted方法中,如果CheckIfValid为true,我会重定向用户,但如果不是,我不做任何事情,是否可以,或者我需要在filterContext上设置一些属性。

您的过滤器很好。 MVC确实提供了一个名为ActionFilterAttribute的不同抽象基类,它实现了这些接口,您可以根据需要进行覆盖。您can read about here有一个很好的概述。如果你派生自那个类,你的过滤器属性代码可以简化一点:

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
            }
        }
    }
}