有没有办法访问当前在Global.asax中执行的控制器?
我想设计一个语法类似的API:
MyClass.RegisterComponents().When(IController => /* Some condition */)
虽然我可以将此代码移动到控制器处于上下文中的位置,但我希望将其保持集中且可移植。
到目前为止,我一直无法获得控制器。有什么想法吗?
我考虑过创建一个基本控制器并从这个基类扩展我的所有控制器,但是,我想让这个库可以通过NuGet安装。因此我无法采用这种方法。
答案 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);
}
}
然后我可以在任何地方访问上下文。