我可以从HttpContext的控制器? [英] Can I get the controller from the HttpContext?
问题描述
给定一个的HttpContext(或HttpContextBase),有没有办法让控制器的一个实例?
的的HttpContext
将举行的一个参考 MvcHandler
,将举行一个参考的RouteData code>,这将坚持是由一个特定的路线调用什么控制器的引用。
注:这不会给你的实际控制人,只有控制器
该特定路线是要
赶上。
块引用>GetController(HttpContextBase的HttpContext)
{
VAR的RouteData =((MvcHandler)httpContext.Handler).RequestContext.RouteData; VAR routeValues = routeData.Values;
VAR matchedRouteBase = routeData.Route;
VAR matchedRoute = matchedRouteBase干线; 如果(matchedRoute!= NULL)
{
路线= matchedRoute.Url?的String.Empty;
} AssignRouteValues(HttpContext的,routeValues);
}
受保护的虚拟VirtualPathData getVirtualPathData(HttpContextBase HttpContext的,RouteValueDictionary routeValues)
{
返回RouteTable.Routes.GetVirtualPath(((MvcHandler)httpContext.Handler).RequestContext,routeValues);
}私人无效AssignRouteValues(HttpContextBase HttpContext的,RouteValueDictionary routeValues)
{
VAR virtualPathData = getVirtualPathData(HttpContext的,routeValues); 如果(virtualPathData!= NULL)
{
VAR vpdRoute = virtualPathData.Route干线;
如果(vpdRoute!= NULL)
{
RouteDefaults = vpdRoute.Defaults;
RouteConstraints = vpdRoute.Constraints;
RouteDataTokens = virtualPathData.DataTokens;
RouteValues = routeValues;
}
}
}这code可能看起来很熟悉,那是因为我从菲尔哈克的的路线调试器源$ C $ C。
Given an HttpContext (or HttpContextBase), is there a way to get an instance of the Controller?
解决方案The
HttpContext
will hold a reference to theMvcHandler
, which will hold a reference to theRouteData
, which will hold a reference to what controller is being invoked by a particular route.NB: This doesn't give you the actual controller, only the controller that the specific route is going to catch.
GetController(HttpContextBase httpContext) { var routeData = ((MvcHandler)httpContext.Handler).RequestContext.RouteData; var routeValues = routeData.Values; var matchedRouteBase = routeData.Route; var matchedRoute = matchedRouteBase as Route; if (matchedRoute != null) { Route = matchedRoute.Url ?? string.Empty; } AssignRouteValues(httpContext, routeValues); } protected virtual VirtualPathData getVirtualPathData(HttpContextBase httpContext, RouteValueDictionary routeValues) { return RouteTable.Routes.GetVirtualPath(((MvcHandler)httpContext.Handler).RequestContext, routeValues); } private void AssignRouteValues(HttpContextBase httpContext, RouteValueDictionary routeValues) { var virtualPathData = getVirtualPathData(httpContext, routeValues); if (virtualPathData != null) { var vpdRoute = virtualPathData.Route as Route; if (vpdRoute != null) { RouteDefaults = vpdRoute.Defaults; RouteConstraints = vpdRoute.Constraints; RouteDataTokens = virtualPathData.DataTokens; RouteValues = routeValues; } } }
This code may look familiar, it's because I've adapted it from Phil Haack's route debugger source code.
这篇关于我可以从HttpContext的控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!