给定一个的HttpContext(或HttpContextBase),有没有办法让控制器的一个实例?
解决方案的的HttpContext 将举行的一个参考 MvcHandler ,将举行一个参考的RouteData ,这将坚持是由一个特定的路线调用什么控制器的引用。
注:这不会给你的实际控制人,只有控制器 该特定路线是要 赶上。
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 the MvcHandler, which will hold a reference to the RouteData, 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的控制器?
发布评论