从Global.asax中的Delegate内访问ControllerContext

时间:2012-01-17 01:42:39

标签: asp.net-mvc asp.net-mvc-3

有没有办法访问当前在Global.asax中执行的控制器?

我想设计一个语法类似的API:

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

虽然我可以将此代码移动到控制器处于上下文中的位置,但我希望将其保持集中且可移植。

到目前为止,我一直无法获得控制器。有什么想法吗?

我考虑过创建一个基本控制器并从这个基类扩展我的所有控制器,但是,我想让这个库可以通过NuGet安装。因此我无法采用这种方法。

2 个答案:

答案 0 :(得分:0)

您可以在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);

    }

答案 1 :(得分:0)

我找到了解决方法。不是很好,但它解决了我的问题。

使用我在David Ebbo的博客(http://blog.davidebbo.com/2011/02/register-your-http-modules-at-runtime.html)上找到的汇编启动方法注册全局IActionFilter。 / p>

全局操作过滤器只是将操作上下文存储在当前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);
        }
    }

然后我可以在任何地方访问上下文。