Выполнение кода перед любым действием - PullRequest
13 голосов
/ 03 января 2012

У меня есть следующее требование:

При каждом запросе к моей веб-странице, независимо от того, какое действие пользователь пытается вызвать, мне нужно вызвать некоторый код, который проверяет наличие ресурса.Если это так, то все в порядке, и метод действия должен вызываться как обычно.

Однако, если этот ресурс недоступен, я хочу, чтобы все запросы возвращали отдельную страницу с просьбой выбрать другой ресурс изсписок доступных.

Так можно ли запустить один метод перед любым методом действия, у которого есть возможность отменить вызов метода действия и сделать что-то еще вместо этого?

Ответы [ 2 ]

19 голосов
/ 03 января 2012

Посмотрите на глобальные фильтры действий (доступно с asp.net mvc 3): http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

По сути, в вашем Global.asax вы можете зарегистрировать фильтр глобально во время запуска приложения (в Application_Start ()) с помощью:

GlobalFilters.Filters.Add(new MyActionFilterAttribute());

Затем вы можете переопределить метод OnActionExecuting и установить свойство Result с помощью RedirectToRouteResult.

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    if (IsMyResourceAvailable())
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary {
                { "Controller", "YourControllerName" },
                { "Action", "YourAction" } 
            });
    }

    base.OnActionExecuting(filterContext);
}
6 голосов
/ 03 января 2012

MVC предоставляет несколько хуков для этого.

В базовом контроллере вы можете переопределить Controller.OnActionExecuting(context), который срабатывает непосредственно перед выполнением действия.Вы можете установить context.Result для любого ActionResult (например, RedirectToAction), чтобы переопределить действие.

В качестве альтернативы вы можете создать ActionFilterAttribute, и точно так же, как и выше, вы переопределите метод OnActionExecuting.Затем вы просто применяете атрибут к любому контроллеру, который нуждается в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...