我可以从HttpContext的控制器? [英] Can I get the controller from the HttpContext?

查看:120
本文介绍了我可以从HttpContext的控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定一个的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的控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆