【问题标题】:Can I get the controller from the HttpContext?我可以从 HttpContext 获取控制器吗?
【发布时间】:2011-07-15 05:14:32
【问题描述】:

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

【问题讨论】:

  • 不,George Stocker 的答案与您的答案一样接近。如果您想在 HttpContext 中保留对控制器的引用,您始终可以通过在您的 IControllerFactory 实现中向您的 HttpContext.Items 添加引用来实现。

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


【解决方案1】:

对于那些只想获取控制器名称而不是实际实例的用户,这是 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();

【讨论】:

  • 这并没有给出实际的方法名称。例如,如果操作名称隐含在请求中
【解决方案2】:

HttpContext 将持有对 MvcHandler 的引用,MvcHandler 将持有对 RouteData 的引用,后者将持有对特定路由正在调用的控制器的引用。

注意:这并没有给你实际的控制者,只有控制者 具体路线要去 抓住。

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 源代码。

【讨论】:

    【解决方案3】:
    var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
    var currentController = currentRouteData.Values["controller"].ToString();
    var currentAction = currentRouteData.Values["action"].ToString();
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • 感谢您的建议。将在以后的帖子中这样做。上面的代码是不言自明的,我想它不需要解释
    • 这个答案基本上是上面比尔的答案的重复(这是你回答之前的 4 年)。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 2011-04-15
      相关资源
      最近更新 更多