我正构建以下过滤器:
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始终运行的基本版本?
如果OnActionExecuted
为CheckIfValid
,true
方法也是filterContext
,我会重定向用户,但如果不是,我就不会做任何事情。是的还是我需要在{{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
}
}
}
}