2016-04-21 46 views
1

我建立了以下過濾器:實施IActionFilter

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

它不需要填充'OnActionExecuting'的代碼。在'OnActionExecuted'的情況下,它是確定不分配值filterContext.Result,這意味着asp.net繼續正常的生命週期管道。 – Balde

回答

3

我其實只需要OnActionExecuted,但由於IActionFilter是一個接口,我必須實現它們兩個。如果我不需要發生任何事情,或者是否需要調用MVC始終運行的基本版本,可以將OnActionExecuting保留爲空嗎?

離開方法體空是在這種情況下完全可以接受的。看起來不錯!

也在OnActionExecuted方法如果CheckIfValid是真實的我將用戶重定向,但如果不是我沒有做任何事情,是OK或者我需要設置一些屬性上而不是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 
      } 
     } 
    } 
}