2016-04-21 2 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, если CheckIfValid is true Я перенаправляю пользователя, но если нет, я ничего не делаю. Это нормально или мне нужно установить некоторое свойство на filterContext.

+1

Это не требуется для заполнения 'OnActionExecuting' с кодом. В случае 'OnActionExecuted', нормально не присваивать значение filterContext.Result, это означает, что asp.net продолжает конвейер нормального жизненного цикла. – Balde

ответ

3

На самом деле мне нужен только OnActionExecuted, но поскольку IActionFilter - это интерфейс, я должен реализовать их оба. Можно ли оставить OnActionExecuting пустым, если мне ничего не нужно, или мне нужно вызвать базовую версию, которую всегда запускает MVC?

Оставив метод пустого тела, вполне допустимо в этом случае. Выглядит неплохо!

Также в методе OnActionExecuted если CheckIfValid верно перенаправить пользователя, но если нет, я ничего не делать, это нормально или мне нужно установить некоторое свойство на 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 
      } 
     } 
    } 
} 
Смежные вопросы