我可以从HttpContext获取控制器吗?

时间:2011-03-14 17:59:27

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

给定一个HttpContext(或HttpContextBase),有没有办法获取Controller的实例?

4 个答案:

答案 0 :(得分:89)

对于那些只想获取控制器名称而不是实际实例的人,如AuthorizeCore(httpContext)的自定义授权覆盖所需,这是干净的代码。

var request = httpContext.Request;
var currentUser = httpContext.User.Identity.Name;
string controller = request.RequestContext.RouteData.Values["controller"].ToString();
string action = request.RequestContext.RouteData.Values["action"].ToString();

答案 1 :(得分:31)

HttpContext将保留对MvcHandler的引用,该引用将保留对RouteData的引用,该引用将保存对特定路由调用的控制器的引用。

  

NB:这不会给你实际的控制器,只给你控制器   特定的路线   捉。

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;
        }
    }
}

这段代码可能看起来很熟悉,因为我已经从Phil Haack的route debugger源代码改编了它。

答案 2 :(得分:1)

不容易,你基本上必须首先从RouteData获取MvcHandler,然后构建Controller。即便如此,它也不会为您提供用于处理操作的实例,因为它将是控制器的新实例。

答案 3 :(得分:1)

var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
var currentController = currentRouteData.Values["controller"].ToString();
var currentAction = currentRouteData.Values["action"].ToString();