加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 我可以从HttpContext获取控制器吗?

发布时间:2020-12-15 19:11:41 所属栏目:asp.Net 来源:网络整理
导读:给定一个HttpContext(或HttpContextBase),有没有办法获得一个Controller的实例? 解决方法 HttpContext将保存对MvcHandler的引用,该引用将保存对RouteData的引用,该引用将保存对特定路由正在调用什么控制器的引用。 NB: This doesn’t give you the actua
给定一个HttpContext(或HttpContextBase),有没有办法获得一个Controller的实例?

解决方法

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

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

这段代码可能看起来很熟悉,这是因为我已经适应了Phil Haack的route debugger源代码。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读