[asp.net-mvc]执行 IActionFilter

发布时间: 2017/3/25 2:01:46
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我建立以下筛选器︰

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 方法如果 CheckIfValidtrue 重定向用户,但如果不是我不做任何事。好或者我需要设置一些属性 filterContext 相反。

解决方法 1:

我实际上只需要 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
            }
        }
    }
}
赞助商