ASP.NET ActionFilters и наследование - PullRequest
2 голосов
/ 16 июля 2010

Все мои контроллеры наследуются от BaseController, который имеет атрибут ActionFilter:

[AnalyticsData]
public class BaseController : Controller {}

public class AccountController : BaseController {}

Некоторые из моих действий в моих контроллерах повторно используют AnalyticsData ActionFilter:

public class AccountController : BaseController
{
    [AnalyticsData(Page="AccountProfile")]
    public ActionResult Profile()
    {
        // return View
    }
}

Я заметил, чтоAnalyticsData ActionFilter запускается только один раз.Это хорошо, и я хочу, чтобы он запускался только один раз, но мне интересно, как это происходит.Если я устанавливаю свою точку останова внутри OnActionExecuting:

public class AnalyticsAttribute : ActionFilterAttribute 
{
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // break point set here
        }
}

... он получает удар только один раз, когда AccountController обслуживает его представление профиля.

Как работают ActionFilters и / или атрибуты, которые [AnalyticsData(Page = "AccountProfile")] в действии переопределяет / заменяет [AnalyticsData] в BaseController?

1 Ответ

3 голосов
/ 17 июля 2010

Короткий ответ: код платформы ASP.NET MVC, который получает список фильтров для каждого действия, удаляет дубликаты (фильтры действий одного типа) таким образом, что он предпочитает фильтры действий, определенные в методе действия, над определенными. на контроллере (или его базовом классе). В MVC 2 эта логика выполняется в нескольких внутренних методах в классе ActionDescriptor

...