Доступ к ControllerContext из делегата в Global.asax - PullRequest
0 голосов
/ 17 января 2012

Есть ли какой-нибудь способ получить доступ к контроллеру, который в данный момент выполняется из Global.asax?

Я бы хотел разработать API с синтаксисом, аналогичным:

MyClass.RegisterComponents().When(IController => /* Some condition */)

Хотя я мог бы переместить этот код в место, где контроллер находится в контексте, я бы хотел сохранить его централизованным и переносимым.

Пока мне не удалось получить контроллер. Есть идеи?

Я подумал о создании базового контроллера и расширении всех моих контроллеров из этого базового класса, однако я хотел бы сделать эту библиотеку переносимой с возможностью установки через NuGet. По этой причине я не могу принять этот подход.

Ответы [ 2 ]

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

Я нашел решение для этого.Не очень хороший, но он решает мою проблему.

Зарегистрируйте глобальный IActionFilter, используя метод запуска сборки, который я нашел в блоге Дэвида Эббо (http://blog.davidebbo.com/2011/02/register-your-http-modules-at-runtime.html).

Глобальный фильтр действий просто сохраняет контекст действия втекущая коллекция HttpContext.Items [], которая является коллекцией для каждого запроса.

public class GlobalActionFilter : System.Web.Mvc.IActionFilter {

        internal static readonly object ActionExecutedFilterKey =
            "__MvcResourceLoaderActionExecutedContext";

        internal static readonly object ActionExecutingFilterKey =
            "__MvcResourceLoaderActionExecutingContext";

        static MvcResourceLoaderGlobalFilter __instance =
            new MvcResourceLoaderGlobalFilter();

        MvcResourceLoaderGlobalFilter() { }

        public void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext) {
            System.Web.HttpContext.Current.Items[ActionExecutedFilterKey] =
                filterContext;
        }

        public void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) {
            System.Web.HttpContext.Current.Items[ActionExecutingFilterKey] =
                filterContext;
        }

        public static void RegisterGlobalFilter() {

            if (!System.Web.Mvc.GlobalFilters.Filters.Contains(__instance))
                System.Web.Mvc.GlobalFilters.Filters.Add(__instance);
        }
    }

Затем я могу получить доступ к контексту в любом месте.

0 голосов
/ 17 января 2012

Вы можете сделать следующее в вашем файле global.asmx.

    private void Application_BeginRequest(object sender, EventArgs e)
    {
        string controllerName = Request.RequestContext.RouteData.Values.Where(p => p.Key =="controller").FirstOrDefault(p => p.Key);

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